접근 제어자를 사용하는 이유는 외부에 보여주고 싶은 정보들을 선택적으로 제공하기 위함이고, 캡슐화와 통하는 면이 있다.
객체지향
객체지향을 정의하면, 의존성 관리이다.
객체지향으로 의존성을 관리함으로써 변경 영향을 최소화하고 독립적인 배포가 가능해지며 독립적인 개발이 가능해진다. 따라서 객체지향에서 가장 중요한 것은 DIP(Dependency Inversion Principle)를 통한 고수준 정책(High Level Policy)와 저수준 구현 세부사항(Low Level Details)의 분리라고 할 수 있다.
LSP(리스코프 치환 원칙): 프로그램의 객체는 프로그램의 정확성을 깨뜨리지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야하는 원칙으로 상위 타입을 상속해서 재정의 했을 때 프로그램이 깨지지 않아야 한다.
ISP(인터페이스 분리 원칙): 클라이언트는 자신이 사용하지 않는 메소드에 의존관계를 맺으면 안되는 원칙이다. 특정 클라이언트를 위한 인터페이스 여러 개가 범용 인터페이스 하나보다 더 낫다. 즉, 비대한 인터페이스보단 더 작고 구체적인 인터페이스로 분리해야한다.
DIP(의존관계 역전 원칙): 추상적인 것은 자신보다 구체적인 것에 의존하지 않고, 변화하기 쉬운 것에 의존해서는 안된다는 원칙이다. 구체적으론 구현 클래스에 의존하지 말고, 인터페이스에 의존해야 하는 원칙이다.
주소값 비교(==)와 값 비교(equals)
==연산자와 String클래스의 equals() 메소드의 가장 큰 차이점은 ==연산자는 비교하고자 하는 두개의 대상의 주소값을 비교하는데 반해 equals 메소드는 비교하고자 하는 두개의 대상의 값 자체를 비교한다. 일반적인 타입들 int형, char형 등은 Call by Value 형태로 기본적으로 대상에 주소값을 가지지 않는 형대로 사용된다. 하지만 String은 일반적인 타입이 아니라 클래스이다. 클래스는 기본적으로 Call by Reference형태로 생성 시 주소값이 부여된다. 그렇기에 String 타입을 선언했을때는 같은 값을 부여하더라도 서로간의 주소값이 다를 수 있다.