TIL: 2024/04/23 - OOP in Java

White 와잇·2024년 4월 23일

TIL

목록 보기
4/40
post-thumbnail

오늘의 정리

자바 컬렉션 종류: List, Queue, Set, Map

  • List: ArrayList(동적배열), LinkedList(동적 연결리스트), Stack(LIFO)
  • Queue: 인터페이스이므로 new LinkedList<>()로 객체 생성
  • Set: 인터페이스이므로 new HashSet<>() 사용
    HashSet(비순서, 비정렬), TreeSet(정렬), LinkedHashSet(순서)
  • Map: 인터페이스이므로 new HashMap<>() 사용
    HashMap(키 null 가능), TreeMap(정렬), HashTableMap(null 불가능)

객체지향 프로그래밍(OOP)

  • 캡슐화: private 등 접근제어자로 아무 곳에서나 쓰지 못하게 함

  • 상속: 재사용성, 의미 연관성, 유지보수성 등의 효율

  • 다형성: 같은 이름의 동작(메서드)이라도 상황에 맞게 다르게 동작

  • 추상화: 상속과 장점이 유사함

  • 오버로딩 vs 오버라이딩
    공통점: 같은 이름의 동작(메서드)이라도 상황에 맞게 다르게 동작하게 함
    오버로딩: 한 객체에서 매개변수의 형식에 따라 실행내용이 다를 수 있음
    오버라이딩: 같은 메서드를 상속, 추상 등을 사용해 객체마다 실행내용이 다를 수 있음

캡슐화를 해서 Getter, Setter를 활용하자.

클래스

필드, 메서드, 생성자(객체가 생성될 때 실행되는 메서드)
접근제어자 + 생성자로 인스턴스 생성 제한 가능
-> private ClassName(){}; 따위로 객체 생성 new ClassName();을 막는다는 뜻

클래스 멤버 사용

멤버 = [필드 + 메서드]를 아우르는 말
보통 인스턴스를 생성해서 인스턴스를 통해 메서드를 실행하지만,
"각 인스턴스마다" 임이 필요하지 않는 공통사용되는 멤버는 클래스 그 자체에서 실행
예) Obejct.equals();
클래스 멤버는 static 사용 권장 (공용 데이터)

  • 상속:
    부모->자식 으로 확장(extends)이기 때문에 부모<=자식 임.
    this 현재객체 접근자, super 부모클래스의 멤버 접근자(자식과 이름이 동일할 때 사용)
  • 제어자:
    static, final(상수, 최종클래스), abstract(추상), private(클래스 내부만), default(패키지 내부), protected(패키지 내부 + 외부 자식 클래스만), public(무제한)
  • 추상클래스(abstract class A):
    extends로 상속하여 사용. 여러 자식 클래스들에게 공통 필드와 메서드를 제공, 추상메서드로 다형성 제공
  • 인터페이스(interface A):
    extends 대신 implements 입력, 추상클래스와 흡사
    상속 관계로 표현될 수 없는 서로 다른 클래스가 동일한 메서드를 구현할 때 사용.
    인터페이스 메서드는 항상 추상메서드 이나, default로 선언하면 메서드 내부 정의 가능
    인터페이스 간 다중 상속 가능함
    상속 + 인터페이스 가능함 class A extends B implements C

어려웠던 부분

클래스 상속 관계에서 아래와 같은 형식의 경우 (참조 변수의 형변환)

부모 타입 변수 = 자식 타입 객체;
*자식 타입 변수 = (자식 타입) 부모 타입 객체;
*윗 줄이 먼저 실행되어야 가능

자식 타입 = 부모 타입의 경우, 부모에게 없는 멤버를 자식에게 적용할 수 없어서 불가능하다고 생각하기로 함. 하지만 형변환 했던 것이 원래대로 돌아오는 것은 가능

보통 '부모 변수 = 자식 객체'로 실행
다음처럼 매개변수의 경우도 자주 보임
method(Parents p) { } 로 선언 후, method(new Child())

접근?

부모-자식의 공통 메서드만 접근가능
부모-자식 공통 메서드 중 자식 메서드로 접근함

회고, 생각

OOP가 어렵다 생각하며 살았다.
예전에 배웠던 내용들이지만, 추상적이어서 그런가 사실 그 때도 잘 활용할 수 있을 거라 생각하진 않았다.
이해가 될 것 같다가도, 추상클래스-인터페이스 쯤 오면 머리가 터졌다..
뭐가 다른건지 알아야 써먹을 것 같은데 차이점을 잘 모르겠더라.
상속 또한 부모가 크다고 생각하니까 거꾸로 된 것 같고 헷갈리더라.

현재는 복습이라 그런지 그럭저럭 알 것 같은 상태.

완벽한 OOP 지향을 위해

오늘도 한 걸음:)

profile
웹개발 도전! 데브옵스 도전!

0개의 댓글