캡슐화
객체지향세상에선 객체에게 상태를 얻어내는게 아닌 할일을 맡기고 결과물을 얻는다.
이때 할일을 맡길 때 해당 객체가 어떤 과정을 거치는 지는 알 필요도 없고 상황에 따라 접근도 불가해야한다.
자바에선 접근제한자로 필드나 메소드의 접근을 컨트롤하고, 상속이나 인터페이스 같이 구체화 된 객체를 생성하고 추상화에 의존해서 구현체가 어떻게 동작하는지 모른채로 추상메서드 이용 등이 있다.
추상화
객체지향세상에서는 객체를 서비스의 관심영역에 맞게 특징을 뽑아내 인스턴스의 설계도인 클래스로 만든다.
만약 은행 서비스를 만든다면 사용자는 '사람' 에서 은행에 돈을 맡길 '고객'의 특징을 뽑아내는 추상화 과정을 진행한다.
자바에선 클래스를 만들때 해당 클래스에 맞는 필드나 메소드를 정의하는 일이 된다.
다형성
자바에선 같은 이름의 메소드를 다르게 사용할 수 있는 오버로딩과 오버라이딩이 존재한다.
오버로딩은 메소드 이름은 같지만 인자의 타입이나 개수가 다를 때 컴파일 시점에 메소드 이름의 변화는 생기지만 개발자는 같은 이름의 메소드를 인자에 맞춰 사용할 수 있다.
오버라이딩은 상속 시에 서브클래스가 슈퍼클래스가 갖고 있는 메소드의 동작방식에 변화를 주고 싶을 때 사용하고, 인스턴스 생성시에 서브 클래스로 생성하고 메소드 실행시에 오버라이딩이 됬다면 서브 클래스의 동작방식을 따른다.
상속성
자바에선 추상화로 클래스를 만들고, 어떤 클래스의 특성과 기능을 재사용하고 싶을 때 해당 클래스를 상속해서 클래스의 특성과 기능을 이어받을 클래스에 넘겨준다. 이때 상속되는 클래스를 슈퍼클래스, 상속받는 클래스를 서브클래스라 한다.
다형성 + 상속성
객체지향 프로그래밍에선 상위 클래스 타입의 참조변수로 하위 클래스의 객체를 담을 수 있다는 것이 중요하다.
예를 들면 상위 클래스 타입의 배열을 만들고, 하위 클래스의 객체를 배열에 넣고 돌아가면서 오버라이딩 된 메소드를 실행하면 같은 메소드를 호출하지만 각기 다른 동작 방식을 가진 메소드가 실행된다.