[Java] 객체지향 프로그래밍
목차
절차 지향에서 객체 지향까지

프로그램은 절차가 전부다.

절차적인 프로그래밍으로 모든 것을 만들 수 있지만, 유지보수와 수정이 복잡해지므로 구조적인 프로그래밍이 나왔고, 거기에 더해서 객체지향 프로그래밍이 나오게 되었다.
기능 위주 vs 데이터 위주로 묶기

→ 데이터 위주로 묶어야 한다.
- 기능 위주로 묶으면 함수의 독립성이 깨진다.
- 함수는 외부의 수정을 받으면 안 된다.
- 함수가 아무런 수정도 하지 않았는데 바뀌면 안 되므로, 그것을 방지하기 위해 매개변수까지 넣었는데도 바뀌는 경우를 방지하기 위함이다.
코드 파일 관리 방법
왼쪽 클래스를 바꿨을 때 오른쪽에서 에러가 나는 것은 막을 수 없다.

그래서 오류가 나는 부분을 한곳에 모은다. 데이터를 정의하는 곳 안으로 들인다.

하나를 고쳤을 때 에러가 나는 곳이 모두 왼쪽에 있기 때문에, 에러가 왼쪽에 있음을 알고 고치면 된다.

캡슐화를 하면 데이터 구조 변경에 따른 코드 수정 범위를 캡슐 범위로 한정할 수 있다.
캡슐화 정리: 데이터 구조와 함수를 하나의 영역에 함께 정의하는 것.
인스턴스 메서드


이런 식으로 리스트가 처리되고 사용된다.
인스턴스 메서드 구현하기 — 객체지향적인 함수 호출로 변경하기
static은 고전적인 함수다. 모든 값을 파라미터로 넘겨받고 일반적인 함수와 똑같이 사용한다.- 인스턴스 함수는 반드시 객체를 통해서 쓰고, 객체를 묵시적으로 넘겨받는다.
static을 붙여서 정의하면 일반 함수,static을 빼고 구현하면 인스턴스 메서드가 된다.
똑같은 로직인데 파라미터로 전달받은 것이 없다. 그럼 어떻게 쓸 수 있을까? 인스턴스 메서드는 이를 위해 this라는 예약어를 사용한다.

위의 기존 함수를 인스턴스 메서드로 만들고 싶을 때, this 키워드로 객체를 넘겨받고 static을 빼면 위와 같이 된다. 즉, static과 파라미터를 지우고 this만으로 인스턴스 메서드를 사용하는 함수로 바꾼 것이다.
캡슐의 은닉성과 접근 지정자
캡슐화 자체는 객체지향을 지원하지 않는 언어에서도 사용 가능하다.
캡슐을 깨지 못하게 하는 도구: 접근 제어자

생성자: 초기화를 위한 특별한 함수
생성자의 조건
- 객체가 생성되자마자 무조건 제일 먼저 실행되어야 한다.
- 생성될 때 단 한 번만 실행되어야 한다.

생성자 오버로드
생성자를 하나도 만들지 않으면 기본 생성자가 저절로 생성된다.

이때 참조변수에는 null이 들어가고, 값 변수에는 0이 들어간다.

이것을 원치 않으면 생성자를 추가해서 원하는 값을 넣어줘야 한다.
캡슐을 깨는 행위는 하지 않도록 해야 한다

Getter/Setter의 용도는?
- “비효율적인 것 같은데 그냥 public으로 하면 안 되나?”
속성명이 변경되는 것이 아니라 데이터 구조가 변경되기 때문이다.
구조가 변경된다는 의미는?


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

HAS-A 관계 (구성/집합)
일반적으로는 사용 관계와 구성 관계를 갖도록 이렇게 사용한다.
- composition(구성): 일체형이라고 생각하면 된다. 부품에 해당하는 객체가 1:N이든 1:1이든, 그것을 소유한 객체와 동일한 시점에 생성되고 동일한 시점에 사라지는 관계를 말한다.
- aggregation(집합): 1:1이든 1:N이든 상관없지만 동일한 생명주기를 가지지 않는다는 점이 차이다. 일반적으로 컬렉션으로 수집되는 관계를 말하며, 부품을 소유한 객체가 만들어져도 부품 객체는 없을 수 있고, 반대로 부품을 소유한 객체가 사라져도 부품 객체는 별도로 생존할 수 있는 관계를 말한다.
IS-A 관계 (상속)
90%는 프레임워크를 가져다 쓰고 10%만 내가 만든다.

참조 형식과 호출되는 메서드의 관계
Exam exam = new NewlecExam()은 되지만, 아래는 절대 안 된다.
객체와 참조 형식의 개수


- 아래는 A 범주에서 메서드 사용이 가능하다.
- A라는 형식을 갖는 자료형식인데 B라는 형식으로 확장하면 위와 같아진다. (형식 변환)
이 경우 super로 f4가 호출되고, 그 다음 f5 → f2 → f3 순으로 호출된다.

단, 중간에 오버라이드된 것이 있으면 오른쪽이 호출된다.
메서드 동적 바인딩 (함수 호출 위치 결정 방식 이해하기)
- 메서드를 오버라이드하면 우선순위가 높아진다고 이해하면 된다.
- “어떻게 객체가 다르다고 호출이 바뀔 수 있지?”라는 의문을 푸는 것이 핵심이다.
호출되는 함수 위치 결정 문제

팩토리 메서드
- 추상화했다 = 공통 분모로 쓰겠다.