본문 바로가기
Today I learned

3. 캡슐화 방법, 상속

by soheemon 2018. 9. 16.


3. 캡슐화 방법, 상속


생성자(Constructors)

- new를 통해 새로운 Instance를 생성할때 반드시 한번 사용되는 특별한 method이다.

- Class의 이름과 동일하다.

- return type을 적지 않는다. (void도 없다)

- class내에 생성자가 하나도 없으면, 기본적으로 파라미터가 없는 생성자가 자동으로 삽입된다.[각주:1]

- 하나의 Class에 여러개의 Constructor가 존재 할 수 있다.(오버로딩이 가능하다.)

Data Scope

- 클래스를, 같은 패키지 내 다른 class나, 외부 패키지에서 사용 및 참조 될 수 있는 데이터 영역이 존재한다.


클래스 접근지정자


- 다른 클래스에서 이 클래스를 사용할 수 있는지 허용여부를 지정하는것을 말한다.

- public : public접근 지정자로 선언된 클래스는 동일한 패키지에 존재하지 않더라도 접근이 가능하다.

- default(접근지정자 생략시) : 다른 패키지에 존재한다면 접근이 불가능하다. 같은 패키지 내에 있는 클래스만 접근 가능하다.d. 멤버(메소드, 필드) 접근 지정자- default, private, protected, public 네가지가 있다.

- public = 패키지의 내부, 외부 혹은 같은 클래스, 다른 클래스에서 도 접근이 가능하다.

- private = 패키지와는 상관없이, 같은 클래스에서만 접근이 가능하다.- protected = 같은 패키지 내의 모든 클래스에서 접근이 가능하다 / 다른 패키지의 클래스라도, 이 클래스를 상속받은 자식의 경우 접근이 가능하다.

- default(또는 package-private) =  동일한 패키지 내에 있는 모든 클래스가 접근이 가능하다. 접근지정자가 생략된경우에 해당한다.



캡슐화

-캡슐화된 객체는 block box와 같다고 생각할 수 있다.- 데이터는 메소드를 이용하여 변경하는것이 유지보수성이 간편하다.



상속


-부모 클래스(슈퍼클래스)에 정의된 필드와 메소드를 자식클래스(서브클래스)가 물려받는것이다.[각주:2]

- 주의할점은, 클래스를 상속하는것이지 객체를 상속하는것이 아니라는 점이다.

- 상속의 장점은 클래스를 계층적으로 분류 및 관리 할 수 있고 필드와 메소드를 재사용 할 수 있다는 점이다.


자바 상속 특징

- 상속의 횟수에 제한을 두지 않는다. (여러번 상속 받을 수 있다)

- 다중 상속을 지원하지 않는다. (한번에 하나만 상속 받을 수 있다. extends 다음에는 오직 하나의 클래스 이름만 작성 할 수 있다.)

- 최상위에 있는 클래스는 java.lang.Object 클래스 이다. (표현하지 않더라도 자동으로 컴파일러에 의해 이루어진다)


상속과 접근 지정자


-상속을 한다 해도 접근 지정자에 영향을 받는다.

- private 멤버: 슈퍼클레스의 멤버에 private 접근지정자가 사용되면 서브클래스는 상속을 받아도 해당 멤버를 (직접) 사용 할 수 없다 [각주:3]

- Protected 멤버: 같은 패키지에 속한 다른 클래스에 접근을 허용한다 /패키지 와 상관없이, 상속받는 서브클래스에만 접근을 허용한다.

- Public 멤버: 패키지와 상관없이 서브클래스 뿐만 아니라 어떤 클래스에서도 접근 할 수 있다.

- Default 멤버: 같은패키지의 모든 클래스에서 접근이 가능하다.












각각의 생성자는  파라미터의 갯수나 데이터 타입에 따라 구분된다.















추가로 객체지향의 특성을 살리기 위해서는 캡슐화의 원칙이 지켜지도록 가능한 접근범위를 작게하여 접근 지정자를 선정하는 것이 좋다.

특히 class를 사용하는 JavaApp에서 데이터멤버에 대해서는 private로 선언하고, public메소드를 통해 private 데이터 멤버를 조작하도록 한다.메소드도 외부에 공개할 필요가 없는것은 public으로 선언하도록 한다.[각주:4]






  1. 생성자가 한개라도 존재하면 자동으로 만들어지지 않는다 [본문으로]
  2. 예를들어 Phone 클래스가 있다고 하자. Phone클래스에는 전화번호라는 필드가 있고 전화 걸기, 전화 받기라는 메소드가 있다. 만약 MobilePhone클래스가 Phone클래스를 상속한다면, MobilePhone클래스에는 자동으로 Phone클래스 의 메소드와 필드가 생성된다. MobilePhone클래스는 따로 객체를 생성하지 않고도 Phone클래스의 메소드/필드를 자신의 것처럼 사용 할 수 있다. [본문으로]
  3. 이 경우에는 데이터 조작을 위해 슈퍼클래스에서 public형태의 메소드가 제공되는것이 바람직하다. [본문으로]
  4. 미묘하게 다른 이야기지만 C와 비교하자면, 함수원형이 선언된 파일에서, 내부적으로 사용되는 함수는 static으로 선언하여 사용범위를 해당 소스파일에서만 제한하고, 사용자가 접근 가능한 함수만 default로 해놓는거랑 비슷한것 같다.확실히 다르다고 생각한점은, C에서는 이름이 같은 함수의 충돌을 방지하기 위해서이지만 JAVA에서는 보안을 목적으로 하는것 같다. [본문으로]

'Today I learned' 카테고리의 다른 글

JAVA 2주차 강의 정리  (0) 2018.10.24
JAVA 1주차 강의정리  (0) 2018.10.14
4. 상속과 캐스팅  (0) 2018.09.16
2. Class개념과 기본적인 Java Programming  (0) 2018.09.16
객체지향프로그래밍  (1) 2018.09.15

댓글