객체지향 == 인간지향
종래의 절차 지향 프로그래밍은 기계어 중심으로, 사람이 이해하기 힘든 부분이 많았다.
때문에 "우리가 보고 느끼고 생활하는 현실 세계처럼 프로그래밍할 수 없을까?"라는 고민 속에 객체 지향의 개념이 탄생함
- 객체 지향의 4대 특성 : 캡슐화, 상속, 추상화, 다형성
클래스 vs 객체
- 클래스
- 분류에 대한 개념 ( 실체 X )
- 분류, 집합. 같은 속성과 기능을 가진 객체를 총칭하는 개념
- 객체
ex ) 사람, 펭귄 → 클래스 / 김연아, 뽀로로 → 객체
추상화 : 모델링
구체적인 것을 분해해서 관심영역에 있는 특성만 가지고 재조합 하는것 ( → 모델링 )
- 객체 : 세상에 존재하는 유일무이한 사물
- 클래스 : 분류, 집합 같은 속성과 기능을 가진 객체를 총칭하는 개념
추상화와 T메모리(JVM의 메모리)
JVM메모리 : https://www.notion.so/JAVA-71d400ac783145be9188eba27fe31abb
- Static 변수 ( 클래스 맴버 · 속성, 정적 변수, 정적 속성) → Static 영역
- 인스턴스 변수 ( 객체 맴버 · 속성, 객체 변수 ) → Heap 영역
- local 변수 ( 지역 변수 ) → Stack 영역
초기화
- 객체 멤버 : 생성자를 통해 초기화
- 정적 멤버 : 정적 실행 영역을 통해 기본값으로 초기화 된다
상속 : 재사용 + 확장
상위 클래스의 특성을 하위 클래스에서 상속하고 거기에 필요한 특성을 추가, 즉 확장해서 사용할 수 있다는 의미
- 객체지향의 상속은 상위 클래스의 특성을 재사용하는 것이다.
- 객체지향의 상속은 상위 클래스의 특성을 확장하는 것이다.
- 객체지향의 상속은 is a kind of 관계를 만족해야한다.
ex) 펭귄은 동물의 한 분류다.
- 상위 클래스에서 구현한 메서드는 하위 클래스에서 사용할 수 있다
→ 클래스 상속 구조에서 최상의 클래스는 Object이다. 따라서, 모든 클래스는 Object의 특성을 물려받는다. ( toString()메서드 사용 가능 )
-
구현 클래스 is able to 인테페이스 → 구현클래스는 인테페이스 할 수 있다
ex) 고래는 헤엄칠 수 있다.
-
펭귄 class가 동물 class를 상속받은 경우, 인스턴스를 생성하면 펭귄(sub) class의 인스턴스만 힙 영역에 생성되는 것이 아니라, 동물(super) class의 인스턴스도 함께 생성된다.
⭐ 상위 클래스는 물러줄 특성이 풍성할 수록 좋고, 인터페이스는 구현을 강제항 메서드의 개수가 적을 수록 좋다.
다형성 : 사용편의성
오버라이딩
- 같은 인자 목록으로 상위 클래스의 메서드를 재정의 ( ride 올라타다 )
- 하위 클래스가 재정의한 메서드를 알아서 호출해 줌으로 형변환이나 instanceod 연산자를 써서 하위 클래스가 무엇인지 신경쓰지 않아도 됨
- 상위 클래스 타입의 객체 참조 변수에서 하위 클래스가 오버라이딩한 메서드를 자동 호출해 줌으로써 깔끔한 코드 유지 가능
오버로딩
- 같은 메서드 이름, 다른 인자 목록으로 다수의 메서드 중복정의 ( load 적재하다 )
- 함수명 하나로 인자 목록만 다르게 하면 되므로 편리
⭐ 상위 클래스 타입의 객체참조 변수를 사용하더라도 하위 클래스에서 오버라이딩한 메서드가 호출된다.
캡슐화 : 정보은닉
public - 모두
protected - 상속 / 같은 패키지 내의 클래스
[ default ] - 같은 패키지 내의 클래스
private - 해당 클래스
- 상속을 받지 않았다면 객체 멤버는 객체를 생성한 후 객체 참조 변수를 이용해 접근해야함
- 정적 멤버는 '클래스명.정적 멤버' 형식으로 접근하는 것을 권장
참조 변수의 복사
- Call by Value( 값에 의한 호출 ) , Call by Reference ( 참조에 의한 호출 )
→ 기본 자료형 변수는 저장하고 있는 값을 그 값 자체로 판단하고, 참조 변수는 저장하고 있는 값을 주소로 판단한다.
자바가 확장한 객체 지향
abstract - 추상 메서드 & 추상 클래스
- 추상 클래스는 객체를 만들 수 없다. → new를 사용할 수 없다.
- 추상 메서드는 하위 메서드에게 메서드 구현을 강제한다. ( 오버라이딩 강제 )
- 추상 메서드를 포함하는 클래스는 반드시 추상 클래스여야 한다.
생성자
- 개발자가 아무런 생성자도 만들지 않으면 자바는 인자가 없는 기본 생성자를 자동으로 만들어준다.
- 인자가 있는 생성자를 하나라도 만든다면 자바는 기본 생성자를 만들어 주지 않는다.
final
- final 키워드가 나타날 수 있는 3군데 → 클래스, 변수, 메서드
- final 클래스 : 상속 불가
- final 변수 : 변경 불가능한 상수가 됨
- final 메서드 : 오버라이딩 금지
instanceof 연산자
- 만들어진 객체가 특정 클래스의 인스턴스인지 물어보는 연산자
- LSP를 어기는 코드에서 주로 나타나는 연산자이므로, 리팩터링 대상인지 아닌지 점검해 봐야한다.
interface & implement
- 인터페이스는 public 추상 메서드와 public 정적 상수만 가질 수 있다.
→ 메서드에 public과 static, final을 붙이지 않아도 자동으로 자바가 알아서 붙여줌
this