오늘의 정리
캡슐화: private 등 접근제어자로 아무 곳에서나 쓰지 못하게 함
상속: 재사용성, 의미 연관성, 유지보수성 등의 효율
다형성: 같은 이름의 동작(메서드)이라도 상황에 맞게 다르게 동작
추상화: 상속과 장점이 유사함
오버로딩 vs 오버라이딩
공통점: 같은 이름의 동작(메서드)이라도 상황에 맞게 다르게 동작하게 함
오버로딩: 한 객체에서 매개변수의 형식에 따라 실행내용이 다를 수 있음
오버라이딩: 같은 메서드를 상속, 추상 등을 사용해 객체마다 실행내용이 다를 수 있음
캡슐화를 해서 Getter, Setter를 활용하자.
필드, 메서드, 생성자(객체가 생성될 때 실행되는 메서드)
접근제어자 + 생성자로 인스턴스 생성 제한 가능
-> private ClassName(){}; 따위로 객체 생성 new ClassName();을 막는다는 뜻
멤버 = [필드 + 메서드]를 아우르는 말
보통 인스턴스를 생성해서 인스턴스를 통해 메서드를 실행하지만,
"각 인스턴스마다" 임이 필요하지 않는 공통사용되는 멤버는 클래스 그 자체에서 실행
예) Obejct.equals();
클래스 멤버는 static 사용 권장 (공용 데이터)
어려웠던 부분
클래스 상속 관계에서 아래와 같은 형식의 경우 (참조 변수의 형변환)
부모 타입 변수 = 자식 타입 객체;
*자식 타입 변수 = (자식 타입) 부모 타입 객체; *윗 줄이 먼저 실행되어야 가능
자식 타입 = 부모 타입의 경우, 부모에게 없는 멤버를 자식에게 적용할 수 없어서 불가능하다고 생각하기로 함. 하지만 형변환 했던 것이 원래대로 돌아오는 것은 가능
보통 '부모 변수 = 자식 객체'로 실행
다음처럼 매개변수의 경우도 자주 보임
method(Parents p) { } 로 선언 후, method(new Child())
부모-자식의 공통 메서드만 접근가능
부모-자식 공통 메서드 중 자식 메서드로 접근함
회고, 생각
OOP가 어렵다 생각하며 살았다.
예전에 배웠던 내용들이지만, 추상적이어서 그런가 사실 그 때도 잘 활용할 수 있을 거라 생각하진 않았다.
이해가 될 것 같다가도, 추상클래스-인터페이스 쯤 오면 머리가 터졌다..
뭐가 다른건지 알아야 써먹을 것 같은데 차이점을 잘 모르겠더라.
상속 또한 부모가 크다고 생각하니까 거꾸로 된 것 같고 헷갈리더라.
현재는 복습이라 그런지 그럭저럭 알 것 같은 상태.
완벽한 OOP 지향을 위해
오늘도 한 걸음:)