본문 바로가기

TIL

[ 11/17 Today I Learned ] 자바 접근제어자 - 캡슐화 / 추상 클래스, 인터페이스 - 다형성

Java 의 객체지향을 계속 배워가고 있다.

 

어제 클래스, 메소드, 생성자. 등등의 것들을 배웠는데.

 

오늘은 "접근제어자"에 대해 배우게 되었다.

 

Java에서는 접근제어자가 총 4종류 있다.

 

public

 

private

 

default

 

protected

 

각 접근제어자마다 외부에서 접근할 수 있는 범위가 다르다.

 

public의 경우, 같은 클래스 내 / 같은 패키지 내 / 다른 패키지에서도 호출할 수 있는 변수,메서드가 포함된다.

 

private의 경우, 같은 클래스 내에서만 호출 가능한 변수,메서드가 포함되며

 

default의 경우 = 접근제어자를 설정하지 않거나, default로 명시적으로 해놓은 경우

같은 패키지 내에서만 접근 가능하다.

 

protected 이 특이한 케이스인데, 같은 패키지에서 접근 가능 + 다른 패키지에서, 이 클래스를 상속받은 경우 자식 클래스에서 접근 가능하다.

 

코드의 응집성과 결합성을 위해 & 객체지향의 캡슐화를 위해 이런 기능을 지원한다.

 

마치 자동차 운전자가 자동차의 동역학적인 요소들을 다 알 필요는 없지 않은가?

 

자동차 회사에서 제공하는 인터페이스인, 핸들/액셀/브레이크/기어만 바꿀 줄 알면, 그 아래에서 자동차가 동작하는 것은 알아서 하듯.

 

그것과 마찬가지의 맥락이다.

 

=======================

 

[ 추상클래스 / 인터페이서 : 다형성 ]

 

다형성이란, 한가지 모양이 다양한 형상/의미를 가진다라는 뜻이다.

 

Method Overloading 같은 경우도 같은 맥락이라 할 수 있겠다.

 

클래스간 상속을 통해서, B클래스가 A클래스를 상속받은 경우

 

B is a kind of A 가 된다.

 

C클래스가 A클래스를 상속받은 경우, C is a kind of A 가 되고.

 

이런 식으로 A클래스로부터 파생된 클래스가 많아질 수 있다.

 

이 때, A클래스의 인스턴스를 통해서 B, C 등등 A클래스로부터 상속된 타입을 다 찍을 수 있다는 것 = Reference 할 수 있다는 것.

 

이를 통해 다형성이 구현된다.

 

이 때, Method Overriding을 통해, 부모 클래스에 있는 메서드를 자식 클래스에서 재정의할 수 있게 되고

 

부모 클래스 타입으로 찍을 수 있는 것은, 자식 클래스에 존재하는 부모클래스의 멤버변수 / 멤버함수인데,

 

코드를 실행시키는 Runtime에서 부모 클래스가 자식 클래스의 부모클래스 멤버함수를 호출하면.

 

자식클래스에서 Override 한 함수가 호출된다. 이를 통해 다형성이 완성된다.

 

코드의 수정이 용이해지며, 명확해진다.( 유지보수 비용이 줄어든다! )

 

 추상 클래스와 인터페이스를 통해 다형성을 구현하는데,

 

추상 클래스는 extends 를 통해 is-a 관계를 만들어주며, 추상화된 객체의 변수와 함수를 통일해서 내가 공통적으로 실행을 보장하고 싶은 부분을 abstract 키워드를 통해, 자식 클래스에서 구현을 강제하게 할 수 있다.

 

추상클래스 그 자체로는 인스턴스를 생성할 수 없다.

 

인터페이스는 '동작'을 명세한다. 그렇기에 이름이 -able ( = ~를 할 수 있는 )인 경우가 많다.

 

인터페이스를 통해, '표준'을 정의할 수 있다.

 

어떤 동작의 메서드 이름을 통일하고, 인터페이스로부터 파생된 = 인터페이스를 구현하는 ( implement ) 모든 객체에 

 

동일한 동작을 보장할 수 있다는 점에서 코드를 짜기 편리해진다, 그리고 서비스에 신뢰성이 생긴다.