Java 107

참조형식과 호출되는 메소드의 관계

Java에서는 객체를 생성하고 사용할 때, "참조형식"과 "객체형식(생성된 실제 클래스)" 이라는 개념이 있습니다.예를 들어 다음과 같은 코드가 있다고 합시다:Exam exam1 = new Exam();NewlecExam exam2 = new NewlecExam();Exam exam3 = new NewlecExam();NewlecExam exam4 = new Exam(); // ❌ 오류 참조형식과 객체형식의 관계Exam exam3 = new NewlecExam();참조형식(왼쪽): Exam → 이 변수는 Exam 클래스에 정의된 변수나 메서드만 사용할 수 있음.객체형식(오른쪽): new NewlecExam() → 실제로는 자식 클래스인 NewlecExam 객체가 생성됨.이런 구조를 통해 "다형성(pol..

Java 2025.07.23

IS A 상속

“has a” 관계란?어떤 객체가 다른 객체를 가지고 있다는 관계입니다.이것은 클래스 안에 다른 클래스를 멤버 변수로 포함하는 구조입니다.예:자동차는 엔진을 가지고 있다Car has a Engine예시 코드:class Engine { // 엔진에 대한 코드}class Car { Engine engine = new Engine(); // Car has a Engine}위 예시처럼 Car 클래스는 Engine 객체를 포함하고 있어서 "has a" 관계입니다.이 방식은 조립(composition) 구조입니다. “is a” 관계란?어떤 객체가 다른 객체의 일종이다는 관계입니다.이것은 상속(inheritance) 을 의미하며, 자바에서는 extends 키워드로 구현합니다.예:고양이는 동물이다 → Cat..

Java 2025.07.23

코드 재사용

현재 구조 설명 (성적관리 프로그램의 기본 형태)클래스 구조Exam 클래스👉 학생 1명의 점수 정보를 담는 클래스입니다.예: kor, eng, math 점수를 필드로 가짐ExamList 클래스👉 Exam 객체들을 배열로 담고, 추가(add)하거나 꺼내는(get) 기능을 가짐예: Exam[] list 와 current(몇 개까지 넣었는지)ExamConsole 클래스👉 사용자에게 입력을 받고 출력하는 기능 (input(), print())Program 클래스👉 main() 메서드가 있는 실행 시작 지점. ExamConsole을 사용해서 프로그램을 동작시킴 확장 버전의 필요성만약 kor, eng, math 외에 science, coding 과목을 추가하고 싶다면 어떻게 할까요?기존 코드를 직접 수정하게..

Java 2025.07.23

Has A 상속

"캡슐들은 서로를 사용하거나 사용되는 관계를 가지고 있다"이 말은, 어떤 클래스가 다른 클래스를 필드로 가지거나, 메서드의 파라미터나 반환값으로 사용하는 관계가 있다는 뜻입니다.예를 들어:private ExamList list;이 코드는 ExamConsole이 ExamList를 내부에서 가지고 있다는 것을 의미하며, Has-A 관계라고 합니다. Has-A 관계의 종류관계 타입UML 기호의미일반 Has-A빈 마름모단순 포함 관계Composition Has-A채워진 마름모생성과 소멸이 함께함 (강한 결합)Aggregation Has-A빈 마름모생성과 소멸이 따로됨 (약한 결합) 예제를 통한 설명ExamConsole 클래스 내부private ExamList list;public ExamConsole() { ..

Java 2025.07.23

UI코드는 분리하는 것이 기본

캡슐화를 더 나눈다"는 말은 한 클래스가 너무 많은 책임을 갖지 않도록 역할을 쪼개는 것입니다. 특히 입출력(UI 코드) 와 데이터 관리 코드를 분리하는 것이 핵심입니다. [1단계 구조] — 모든 책임이 한 클래스에 몰려 있음class ExamList { private Exam[] exams; private int current; public void input() { // 사용자로부터 키보드 입력받아 Exam 객체 생성 // exams에 추가 } public void print() { // exams 배열에서 성적 꺼내서 화면에 출력 }}❌ 문제점input()도 하고 print()도 하면서, 데이터 저장까지 처리함즉, 이 클래스는 "..

Java 2025.07.23

왜 캡슐화를 해야하는가?

상황 정리: 캡슐화를 왜 해야 하는가?기본 코드public class Exam { private int kor;}외부에서는 아래처럼 exam.kor = 30;처럼 직접 접근할 수 없습니다. 왜냐하면 private이기 때문입니다.그럼 이렇게 물을 수 있죠:“그냥 public int kor;로 하면 한 줄로 끝나는데, 왜 일부러 private로 막아두고, setKor()라는 함수까지 만들어야 하죠?” 캡슐화의 목적핵심 정의캡슐화란 데이터 구조와 그 데이터를 사용하는 함수를 하나의 영역(클래스) 안에 묶는 것입니다.그리고 데이터 구조가 변경되더라도 외부 코드가 영향을 받지 않게 하기 위해 존재합니다.즉, “외부에서 내부 구조를 직접 만지지 못하게 하고, 내부의 변경이 외부에 영향을 주지 않게 만들기 위한..

Java 2025.07.23

생성자

객체를 만들고 또 초기화 해야 함다음과 같은 코드가 있다고 가정합시다.public class Program { public static void main(String[] args) { ExamList list = new ExamList(); // ① 객체 생성 list.init(); // ② 초기화 함수 호출 list.inputList(); // ③ 입력 list.init(); // ④ 또 초기화?? }}🤔 왜 이런 문제가 생겼을까?ExamList list = new ExamList(); 이 줄에서는 객체만 생성합니다. (메모리만 할당)실제 데이터 공간..

Java 2025.07.23

인스턴스 메서드 구현

문제 상황: 함수에서 객체를 직접 다룸초기에 작성된 코드는 다음과 같습니다:void main() { ExamList list = new ExamList(); ExamList.inputList(list); ExamList.printList(list); ExamList.saveList(list);} ExamList 클래스에 inputList, printList, saveList 같은 메서드가 static으로 정의되어 있습니다.그래서 각 메서드에 list라는 객체를 매개변수로 전달하고 있어요.즉, 마치 함수가 외부에 있는 구조에서 list라는 객체를 계속 들고 다니며 전달하는 식입니다. 🤔 왜 이게 문제일까?list는 자신에 대한 행동(입력, 출력, 저장)을 직접 하지 못하고, 외부에서..

Java 2025.07.22

캡슐화

함수의 개수가 많아지는 문제와 수납 방식의 고민문제 상황프로그램이 커질수록 addStudent(), editExam(), printStudent() 등 함수들이 폭발적으로 늘어납니다.이 함수들을 어떻게 나누고 관리할 것인가가 설계의 핵심이 됩니다. 기능(function)에 따라 분리한 방식 vs 데이터(data)에 따라 분리한 방식기능 중심 분할 (기능 모듈 방식)Input.java: inputExam, inputStudent, inputOmokSort.java: sortExams, sortStudents, ...Draw.java: drawOmok, drawBoard, ...장점: 함수의 역할별로 잘 정리됨단점: 서로 다른 데이터 구조를 건드리기 때문에 독립성 침해 위험데이터 중심 분할 (데이터 모듈 방..

Java 2025.07.22