객체지향의 특징

안승수·2023년 1월 31일
0

Java

목록 보기
7/8
post-thumbnail

앞서 실존하는 대상의 상태와 행위를 추상화하여 클래스로 나타낼 수 있다고 하였다.
이러한 객체간의 협업(상호작용)을 통해 프로그래밍 하는 것을 객체지향 프로그래밍이라고 한다.
OOP의 대표적인 특성은 4가지로 나타낼 수 있다.

추상화(Abstraction), 다형성(Polymorphism), 상속(Inheritance), 캡슐화(Encapsulation)

1. 추상화

현실의 대상으로부터 속성과 기능을 추출하여 클래스로 나타낼 수 있다.

추상클래스는 미완성 설계도, 인터페이스는 기본 설계도

미완성은 인스턴스화 할 수 없으며, 상속 및 구현한 클래스를 통해 사용가능하다.
단, 이때 상속 및 구현 클래스는 추상메서드를 반드시 오버라이딩해야 한다.(구현의 강제성 부여)
구현과 사용의 분리

  • 추상 클래스 (extends)
  1. 추상 메서드를 가지고 있거나, 생성불가한 의미로 나타내고자 할 때
  2. 일반 멤버변수,멤버메소드를 가질 수 있다.
  • 인터페이스 (implements)
  1. 고도화된 추상 클래스로, 추상 메서드와 상수만을 포함한다.
  2. public abstract final, public abstract이 생략되어 있다.
  3. 다중 상속이 가능하다.
  4. 표준화, 구현과 사용의 분리, 상속관계로는 표현이 불가능한 클래스간 관계 표현, 구현의 강제성
  • static method :
  • default method : 새로 추가된 구현이 기존의 구현 클래스에 영향을 미치지 않기 위함.(public)
    디폴트 메서드간의 충돌은 구현 클래스에서 오버라이딩하여 모호성 방지
    조상 클래스와 인터페이스간의 충돌은 조상 클래스가 호출된다.(더 구체화)

2. 다형성

하나의 객체를 여러가지 타입으로 참조할 수 있다.

단, 상속을 전제로 한다.(모든 클래스는 Object Class를 상속받는다.)
부모 타입의 참조변수로 자식 인스턴스를 참조할 수 있다.

  • 참조 변수의 타입에 따라 활용 가능한 범위를 조절한다.(사용하는 쪽이 사용범위를 결정)

instance of 연산자를 통해 해당 타입으로 참조가능한지를 알 수 있다.

A instance of B == true -> B는 A의 조상이다.

virtual Method Invocation 및 Dynamic Binding

멤버 변수는 참조 변수를 따르고, 오버라이딩된 메서드는 인스턴스의 메서드를 따른다.

3. 상속

부모의 자산을 물려받아 자식을 정의하고, 재사용이 가능하다.
단, 생성자와 초기화 블록은 상속되지 않는다.
코드 절감 및 유지보수 용이, 취사 선택은 불가능하다.
extends, IS A(구현상속), 단일 상속
모든 클래스의 시조 클래스인 Object 클래스가 존재한다.

  • Object 클래스의 toString(),hashCode(),equals() 메서드는 재정의하여 자주 사용한다.
  • 단일상속만 지원하기 때문에 인터페이스와 HAS A(위임상속) 관계로 다중 상속이 불가한 상황을 극복한다.
  • 메서드 재정의(Overriding)를 활용하여 상속받은 메서드를 자식이 수정,보완할 수 있다.

메소드 오버라이딩(Method Override) @Override

상속을 통해 물려받은 메소드를 하위클래스에서 계승하되 수정,보완하는 경우를 뜻한다.

  • 리턴타입이 같아야 한다.
  • 메소드 이름이 같아야 한다.
  • 매개변수의 목록(타입,수,순서)가 같아야 한다.
  • 부모에서 물려받은 것보다 좁은 범위의 접근 제한자를 사용할 수 없다.
  • 부모보다 더 큰 예외를 던질 수 없다.

super : 부모 클래스 호출

  • 조상으로부터 물려받은 멤버를 참조할 때 사용하는 참조 변수이다.
  • 생성자의 첫줄에 this 혹은 super가 명시적이지 않으면 자동으로 super()를 컴파일러가 삽입한다.
  • 조상의 멤버는 조상이 초기화하여야 한다.

4. 캡슐화

데이터의 은닉과 보호를 위해 접근 지정자를 활용하며, 메소드를 통해 데이터를 보호한다.

접근 지정자를 사용하여 데이터의 접근 범위를 설정한다.(getter,setter)

public > protected > (default) > private

  • private : 같은 클래스에서만 접근 가능
  • default : 같은 패키지에서만 접근 가능
  • protected : 같은 패키지 혹은 다른 패키지인 경우 자손 클래스만 접근 가능
  • public : 접근 제한 없음

활용 지정자를 통해 데이터의 특성을 나타낸다.

  • static : 변화가 드문(공용)
  • final : 변경 금지 (클래스 : 상속 불가, 메소드 : 오버라이딩 불가, 변수 : 상수취급)
  • abstract : 미완성 (클래스 : 인스턴스화 불가, 메소드 : 구현부 없음)

ETC

모든 클래스는 하나의 패키지에 속해야 한다.

패키지란 물리적인 디렉토리를 뜻한다. 일반적으로 도메인을 역순으로 작성하고, 소문자로 작성한다.

다른 패키지의 클래스를 사용하는 경우 import를 사용한다.

  • *는 recursive하지 않고 바로 하위 패키지만 가지고 온다.
profile
To be FullStack Developer

0개의 댓글