[JAVA] 상속, 캡슐화, 다형성, 추상화

승 아·2023년 2월 27일

자바의 객체지향 프로그래밍에는 상속, 캡슐화, 다형성, 추상화가 있다.

상속

  • 기존의 클래스를 재사용하여 새로운 클래스를 작성하는 것

  • 적은 양의 코드로 새로운 클래스를 작성할 수 있고 코드를 공통적으로 관리할 수 있기 때문에 코드의 추가 및 변경이 매우 용이

  • 단일상속만 가능

  • '~은 ~이다. ex) sportscar는 car이다.

    cf) 포함관계 : 상속 외 클래스를 재사용하는 방법, 한 클래스의 멤버변수로 다른 클래스 타입의 참조변수를 선언하는 것

    --> '~은 ~을 가지고 있다.
    ex) 원은 점을 가지고 있다.

오버로딩 vs 오버라이딩

  • 오버로딩 : 기존에 없는 새로운 메서드를 정의하는 것(new)

  • 오버라이딩 : 조상 클래스로부터 상속받은 메서드의 내용을 변경하는 것(change)

super vs super( )

  • super : 자손 클래스에서 조상 클래스로부터 상속받은 멤버를 참조하는데 사용되는 참조변수, 상속받은 멤버와 자신의 멤버의 이름이 같을 때 상속받은 멤버에 super를 붙여 구분

  • super( ) : 조상의 생성자를 호출하는데 사용

       

캡슐화

  • 특정 객체 안에 관련된 속성과 기능을 하나의 캡슐(capsule)로 만들어 데이터를 외부로부터 보호하는 것

  • 정보 은닉(data hiding) : 데이터 보호, 내부적으로만 사용되는 데이터에 대한 불필요한 외부 노출을 방지 목적
    -->외부로부터 객체의 속성과 기능이 함부로 변경되지 못하게 막고, 데이터가 변경되더라도 다른 객체에 영향을 주지 않기에 독립성을 확보

캡슐화를 수행하기 위한 핵심적인 수단으로 접근제어자(Access Modifier)와 getter와 setter 메서드가 있다.

접근 제어자

  • 멤버 또는 클래스에 사용되어, 해당하는 멤버 또는 클래스를 외부에서 접근하지 못하도록 제한하는 역할

  • 사용될 수 있는 곳 : 클래스, 멤버변수, 메서드, 생성자

  • 접근 가능 범위

    • private : 같은 클래스 내
    • (default) : 같은 패키지 내
    • protected : 같은 패키지 내, 다른 패키지의 자손클래스
    • public : 접근 제한 x

객체지향의 캡슐화의 목적을 달성하면서도 데이터의 변경이 필요한 경우 대표적으로 private 접근제어자가 포함되어 있는 객체의 변수의 데이터 값을 추가하거나 수정하고 싶을 때 getter와 setter 메서드를 사용할 수 있다.

setter 메서드

  • 외부에서 메서드에 접근하여 조건에 맞을 경우 데이터 값을 변경 가능하게 해줌

  • 일반적으로 메서드명에 set-을 붙여서 정의

getter 메서드

  • 이렇게 설정한 변수 값을 읽어오는 데 사용하는 메서드

  • 경우에 따라 객체 외부에서 필드 값을 사용하기에 부적절한 경우가 발생할 수 있음, 이럴 경우 그 값을 가공한 이후에 외부로 전달하는 역할을 함

  • 일반적으로 메서드명에 get-을 붙여서 정의

자바에서 다형성이란 한 타입의 참조변수를 통해 여러 타입의 객체를 참조할 수 있도록 만든 것으로, 상위 클래스 타입의 참조변수를 통해서 하위 클래스의 객체를 참조할 수 있도록 허용한 것을 말한다.

인스턴스를 같은 타입의 참조변수로 참조하는 것과 상위 클래스 타입의 참조변수로 참조하는 것은 둘 다 같은 타입의 인스턴스지만 참조변수의 타입에 따라 사용할 수 있는 멤버의 개수가 달라진다는 차이점이 있다.

SmartTV s = new SmartTV(); // 참조 변수와 인스턴스의 타입이 일치
Tv t = new SmartTv(); // 상위 클래스 타입 참조변수로 하위 클래스의 인스턴스를 참조

Tv가 SmartTv의 상위클래스라고 할 때, 인스턴스를 상위 클래스 타입의 참조변수로 참조하는 t는 SmartTv인스턴스의 멤버 중 Tv클래스에 정의되지 않은 멤버는 사용이 불가능하다.

참조변수의 다형적인 특징은 메서드의 매개변수에도 적용된다.
쉽게 말해 큰 객체 안에 작은 객체를 넣어서 여러 형태로 변환해 사용하는 것이다.

profile
개발 공부를 기록하는 공간

0개의 댓글