반응형

1️⃣ 데이터 은닉과 보호 (Encapsulation)
- 정보를 보호하기 위한 대책
- 변수는 private 접근으로 막기
- public은 모두에게 열려있기 때문에 누군가 정보를 바꿀 수 있다
- private은 같은 클래스 안에서만 쓸 수 있다
- 공개되는 메서드를 통한 접근 통로 마련: setter / getter
- 메서드에 정보 보호 로직 작성
- 변수는 private 접근으로 막기
🔹 객체의 생성 제어
- 여러 개의 객체가 필요 없는 경우
- 객체를 구별할 필요가 없는 경우 = 수정 가능한 멤버 변수가 없고 기능만 있는 경우
- 이런 객체를 stateless한 객체라고 한다.
- 객체를 계속 생성/삭제하는데 많은 비용이 들어서 재사용이 유리한 경우
🔹 Singleton 디자인 패턴
- 외부에서 생성자에 접근 금지 → 생성자의 접근 제한자를 private으로 설정
- 내부에서는 private에 접근 가능하므로 직접 객체 생성 → 멤버 변수이므로 private 설정
- 외부에서 private member에 접근 가능한 getter 생성 → setter는 불필요
- 객체 없이 외부에서 접근할 수 있도록 getter와 변수에 static 추가
2️⃣ 다형성 (Polymorphism)
하나의 객체가 많은 형(타입)을 가질 수 있는 성질
- 상속 관계에 있을 때 조상 클래스의 타입으로 자식 클래스 객체를 레퍼런스할 수 있다.
🔹 다형성의 활용
- 다른 타입의 객체를 다루는 배열
- 배열의 특징 - 같은 타입의 데이터를 묶음으로 다룬다
- 다형성으로 다른 타입의 데이터를 하나의 배열로 관리
- Object는 모든 클래스의 조상
- Object의 배열은 어떤 타입의 객체라도 다 저장할 수 있음
- 자바의 자료구조를 간단하게 처리할 수 있음
- Collection API
- 매개변수의 다형성
- 조상을 파라미터로 처리한다면 객체의 타입에 따라 메서드를 만들 필요가 없어진다
- API에서 파라미터로 Object를 받는다는 것은 모든 객체를 처리한다는 말이다
3️⃣ 객체의 형 변환
🔹 다형성과 참조형 객체의 형 변환
- 메모리에 있는 것과 사용할 수 있는 것의 차이
- 메모리에 있더라도 참조할 수 있는 변수의 타입에 따라 접근할 수 있는 내용이 제한됨
🔹 참조형 객체의 형 변환
- 하위 타입을 상위 타입으로 변환 → 묵시적 캐스팅
- 자손 타입의 객체를 조상 타입으로 참조 : 형 변환 생략 가능
- 조상의 모든 내용이 자식에 있기 때문에 걱정할 필요는 없다
- 자손 타입의 객체를 조상 타입으로 참조 : 형 변환 생략 가능
- 상위 타입을 하위 타입으로 형 변환 → 명시적 캐스팅
- 조상 타입을 자손 타입으로 참조 : 형 변환 생략 불가
- 조상을 무작정 자손으로 바꿀 수는 없다
- 메모리의 객체는 자손타입의 메소드가 없기 때문
- instanceof 연산자
- 실제 메모리에 있는 객체가 특정 클래스 타입인지 boolean으로 리턴
4️⃣ 정적 바인딩과 동적 바인딩
참조 변수의 레벨에 따른 객체의 멤버 연결 ⭐
- `superClass.method()`를 했을 때 superClass의 메서드가 호출될 거 같지만 이미 Override한 상태라면 subClass.method()가 호출된다.
정적 바인딩 (static binding)
- 컴파일 단계에서 참조 변수의 타입에 따라 연결이 달라짐
- 상속 관계에서 객체의 멤버 변수(static/instance)가 중복될 때 또는 static method
동적 바인딩 (dynamic binding)
- 다형성을 이용해서 메서드 호출이 발생할 때 runtime에 메모리의 실제 객체의타입으로 결정
- 상속 관계에서 객체의 instance method가 재정의되었을 때 마지막에 재정의된 자식 클래스의 메서드가 호출됨
- 최대한 메모리에 생성된 실제 객체의 최적화된 메서드가 동작한다
String name이 겹칠 때는 부모 클래스의 name이 출력되지만 func() 메서드 가 겹칠 때는 자식 클래스의 func()가 실행된다 (→ 동적 바인딩)
객체가 출력되는 과정
- System.out.print(Object obj)를 이용한 객체 출력
- PrintStream의 print 메서드
- String의 valueOf
- Obejct의 toString
5️⃣ Object 메서드 재정의
Object 클래스
- 가장 최상위 클래스로 모든 클래스의 조상
- Object의 멤버는 모든 클래스의 멤버
toString 메서드
- 객체를 문자열로 변경하는 메서드
- 정작 궁금한 내용은 주소값 따위가 아닌 내용
equals 메서드
- 두 객체가 같은지를 비교하는 메서드
- 두 개의 레퍼런스 변수가 같은 객체를 가리키고 있는가?
- 객체의 주소 비교: `==`
- 객체의 내용 비교: `equals`
hashCode (파이썬에서 set 같은 거)
- 객체의 해시 코드: 시스템에서 객체를 구별하기 위해 사용되는 정수 값
- equals 메서드를 재정의할 때는 반드시 hashCode도 재정의할 것
- HashSet, HashMap 등에서 객체의 동일성을 확인하기 위해 사용
- Object class에 정의된 hashCode: `public native int hashCode();`
- 미리 작성된 String이나 Number 등에서 재정의된 hashCode 활용 권장
- `native`는 함수의 구현이 c언어로 되어 있어 빠르다
반응형