본문 바로가기

프로그램 이론/JAVA

[JAVA]객체지향언어의 개넘 - 2

1. 상속

  1.1. 상속의 정의와 장점

    - 상속이란?

      - 기존의 클래스를 재사용해서 새로운 클래스를 작성하는 것

      - 두 클래스를 조상과 자손으로 관계를 맺어주는 것

      - 자손은 조상의 모든 멤버를 상속받는다.(생성자, 초기화블럭 제외)

      - 자손의 멤버개수는 조상보다 적을 수 없다.(같거나 많다.)

 

 1.2. 클래스간의 관계 - 상속관계

   - 공통부분은 조상에서 관리하고 개별부분은 자손에서 관리한다.

   - 조상의 변경은 자손에 영향을 미치지만, 자손의 변경은 조상에 아무런 영향을 미치지 않는다.


 1.2. 클래스간의 관계 - 포함관계

   - 포함이란?

    - 한 클래스의 멤버변수로 다른 클래스를 선언하는 것

    - 작은 단위의 클래스를 먼저 만들고, 이 들을 조합해서 하나의 커다란 클래스를 만든다.

 

1.3. 클래스간의 관계결정하기 - 상속 vs 포함

  - 가능한 한 많은 관계를 맺어주어 재사용성을 높이고 관리하게 쉽게 한다.

  - is-a와 has-a를 가지고 문장을 만들어 본다.


 1.3. 클래스간의 관계결정하기 - 예제설명

   - 원은 도형이다. : 상속관계

   - 원은 점을 가지고 있다 : 포함관계


 1.3. 클래스간의 관계결정하기 - 예제설명2

 1.4. 단일상속

   - Java는 단일 상속만을 허용한다.

 - 비중이 높은 클래스 하나만 상속관계로 나머지는 포함관계로 한다.


 

 1.5. Object클래스 - 모든 클래스의 최고조상

   - 조상이 없는 클래스는 자동적으로 Object클래스를 상속받게 된다.

   - 상속계층도의 최상위에는 Object클래스가 위치한다.

   - 모든 클래스는 Object클래스에 정의된 11개의 메서드를 상속받는다.


 2. 오버라이딩

  2.1. 오버라이딩(overriding)이란?

   - 조상클래스로부터 상속받은 메서드의 내용을 상속받는 클래스에 맞게 변경하는 것을 오버라이딩이라고 한다.

 

 2.2. 오버라이딩의 조건

   - 선언부가 같아야 한다.(이름, 매개변수, 리턴타입)

   - 접근제어자를 좁은 범위로 변경할 수 없다.

    - 조상의 메서드가 protected라면, 범위가 같거나 넓은 protected나 public으로만 변경할 수 있다.

   - 조상클래스의 메서드보다 많은 수의 예외를 선언할 수 없다.


 2.3. 오버로딩 vs 오버라이딩


 2.4. super - 참조변수

  - this : 인스턴스 자신의 가리키는 참조변수, 인스턴스의 주소가 저장되어있음

           모든 인스턴스 메서드에 지역변수로 숨겨진 채로 존재

  - super : this와 같음. 조상의 멤버와 자신의 멤버를 구별하는 데 사용


 


 2.5. super() - 조상의 생성자

   - 자손클래스의 인스턴스를 생성하면, 자손의 멤버와 조상의 멤버가 합쳐진 하나의 인스턴스가 생성된다.

   - 조상의 멤버들도 초기화되어야 하기 때문에 자손의 생성자의 첫 문장에서 조상의 생성자를 호출해야 한다.


 3. package와 import

  3.1. 패키지(package)

    - 서로 관련된 클래스와 인터페이스의 묶음

    - 클래스가 물리적으로 클래스파일(*.class)인 것처럼 패키지는 물리적으로 폴더이다.

      패키지는 서브패키지를 가질 수 있으며 '.'으로 구분한다.

    - 클래스의 실제이름은 패키지명이 포함된 것이다.

    - rt.jar는 Java API의 기본 클래스들을 압축한 파일


  3.2. 패키지의 선언

    - 패키지는 소스파일에 첫 번째 문장으로 단 한번 선언한다.

    - 하나의 소스파일에 둘 이상의 클래스가 포함된 경우 모두 같은 패키지에 속하게 된다.

    - 모든 클래스는 하나의 패키지에 속하며, 패키지가 선언되지 않은 클래스는 자동적으로

      이름없는 패키지에 속하게 된다.


  3.3. 클래스패스 설정

    - 클래스패스는 클래스파일을 찾는 경로 구분자는 ','

    - 클래스패스에 패키지가 포함된 폴더나 jar파일을 나열한다.

    - 클래스패스가 엾으면 자동적으로 현재 폴더가 포함되지만 클래스패스를 지정할 때는 현재 폴더도 함께

      추가해주어야 한다.

    - 클래스패스로 자동 포함된 폴더 for클래스파일 : 수동생성 해야함

    - 클래스패스로 자동 포함된 폴더 for, jar파일 : JDK설치시 자동 생성됨


 3.4. import문

   - 사용할 클래스가 속한 패키지를 지정하는데 사용.

   - import문을 사용하면 클래스를 사용할 때 패키지명을 생략할 수 있다.


 3.5. import문의 선언

   - import문은 패키지문과 클래스선언의 사이에 선언한다.


 - import문을 선언하는 방법은 다음과 같다.


 3.5. import문의 선언 - 선언 예


 4. 제어자

  4.1. 제어자란?

    - 클래스, 변수, 메서드의 선언부에 사용되어 부가적인 의미를 부여한다.

    - 제어자는 크게 접근 제어자와 그 외의 제어자로 나뉜다.

    - 하나의 대상에 여러 개의 제어자를 조합해서 사용할 수 있으나 접근제어자는 단 하나만 사용할 수 있다.


 4.2. static - 클래스의 공통적인


 4.3. final - 마지막의, 변경될 수 없는


 4.4. 생성자를 이용한 final 멤버변수 초기화

  - final이 붙은 변수는 상수이므로 보통은 선언과 초기화를 동시에 하지만

    인스턴스변수의 경우 생성자에서 초기화 할 수 있다.


 4.5. abstract - 추상의, 미완성의


 4.6. 접근 제어자

  - 멤버 또는 클래스에 사영되어, 외부로부터의 접근을 제한한다.


 4.7. 접근 제어자를 이용한 캡슐화

   - 접근 제어자를 사용하는 이유

    - 외부로부터 데이터를 보호하기 위해서

    - 외부에는 불필요한, 내부적으로만 사용되는 부분을 감추기 위해서


 4.8. 생성자의 접근 제어자

   - 일반적으로 생성자의 접근 제어자는 클래스의 접근 제어자와 일치한다.

   - 생성자에 접근 제어자를 사용함으로써 인스턴스의 생성을 제한할 수 있다.


 4.9. 제어자의 조합


 5. 다형성이란?

  5.1. 다형성이란

    - 여러가지형태를 가질 수 있는 능력

    - 하나의 참조변수로 여러 타입의 객체를 참조할 수 있는 것 즉, 조상타입의 참조변수로 자손타입의 객체를

      다룰 수 있는 것이 다형성

    - 조상타입의 참조변수로 자손타입의 인스턴스를 참조할 수 있지만 반대로 자손타입의 참조변수로 조상타입의

      인스턴스를 참조할 수는 없다.


  5.2. 참조변수의 형변환

    - 서로 상속관계에 있는 타입간의 형변환만 가능하다.

    - 자손 타입에서 조상타입으로 형변환하는 경우, 형변환 생략가능


 5.3. instanceof 연산자

   - 참조변수가 참조하는 인스턴스의 실제 타입을 체크하는데 사용

   - 이항연산자이며 피연산자는 참조형 변수와 타입. 연산결과는 true, false

   - instanceof의 연산결과가 true이며, 해당 타입으로 형변환이 가능하다.


 5.4. 참조변수와 인스턴스변수의 연결

   - 멤버변수가 중복정의된 경우, 참조변수의 타입에 따라 연결되는 멤버변수가 달라진다.

     (참조변수타입에 영향을 받음)

   - 메서드가 중복정의된 경우, 참조변수의 타입에 관계없이 항상 실제 인스턴스의 타입에 정의된

     메서드가 호출된다.(참조변수타입에 영향을 받지 않음)


 5.5 매개변수의 다형성

   - 참조형 매개변수는 메서드 호출시, 자신과 같은 타입 또는 자손타입의 인스턴스를 넘겨줄 수 있다.


 5.6. 여러 종류의 객체를 하나의 배열로 다루기

   - 조상타입의 배열에 자손들의 객체를 담을 수 있다.


 


 6. 추상 클래스(abstract class)

  6.1. 추상클래스란?

   - 클래스가 설계도라면 추상클래스는 미완성 설계도

   - 추상메서드를 포함하고 있는 클래스

   - 일반메서드가 추상메서드를 호출할 수 있다.(호출할 때 필요한 건 선언부)

   - 완성된 설계도가 아니므로 인스턴스를 생성할 수 없다.

   - 다른 클래스를 작성하는 데 도움을 줄 목적으로 작성된다.


 6.2. 추상메서드란?

   - 선언부만 있고 구현부가 없는 메서드

   - 꼭 필요하지만 자손마다 다르게 구현될 것으로 예상되는 경우에 사용

   - 추상클래스를 상속받는 자손클래스에서 추상메서드의 구현부를 완성해야한다.


 6.3. 추상클래스의 작성

   - 여러 클래스에 공통적으로 사용될 수 있는 추상클래스를 바로 작성하거나 기본 클래스의 공통 부문을

     뽑아서 추상클래스를 만든다.



7. 인터페이스(interface)

  7.1. 인터페이스란?

    - 일종의 추상클래스. 추상클래스보다 추상화 정도가 높다.

    - 실제 구현된 것이 전혀 없는 기본 설계도.

    - 추상메서드와 상수만을 멤버로 가질 수 있다.

    - 인스턴스를 생설할 수 없고, 클래스 작성에 도움을 줄 목적으로 사용된다.

    - 미리 정해진 규칙에 맞게 구현하도록 표준을 제시하는 데 사용된다.


 7.2. 인터페이스의 작성

   - class대신 interface를 사용한다는 것 외에는 클래스 작성과 동일하다.

  

- 하지만, 구성요소(멤버)는 추상메서드와 상수만 가능하다.


 7.3. 인터페이스의 상속

  - 인터페이스도 클래스처럼 상속이 가능하다.(클래스와 달리 다중상속 허용)

  - 인터페이스는 Object클래스와 같은 최고 조상이 없다.


 7.4. 인터페이스의 구현

  - 인터페이스를 구현하는 것은 클래스를 상속받는 것과 같다. 다만 extends 대신 implements를 사용한다.


  - 인터페이스에 정의된 추상메서드를 완성해야 한다.


  - 상속과 구현이 동시에 가능하다.

 

 7.5. 인터페이스를 이용한 다형성

   - 인터페이스 타입의 변수로 인터페이스를 구현한 클래스의 인스턴스를 참조할 수 있다.


   - 인터페이스를 메서드의 매개변수 타입으로 지정할 수 있다.


   - 인터페이스를 메서드의 리턴타입으로 지정할 수 있다.


 7.6. 인터페이스의 장점


 

 7.7. 인터페이스의 이해


 7.8. 디폴트 메서드

   - 인터페이스에 디폴트 메서드, static 메서드를 추가 가능하게 바뀜

   - 클래스와 달리 인터페이스에 새로운 메서드를 추가하기 어려움

   - 해당 인터페이스를 구현한 클래스가 추가된 메서드를 구현하도록 변경 필요

   - 이러한 문제점을 해결하기 위해 디폴트 메서드를 고안

   - 디폴트 메서드는 인터페이스에 추가된 일반 메서드


 - 디폴트 메서드가 기존의 메서드와 충돌하는 경우 아래와 같이 해결


 8. 내부 클래스

  8.1. 내부 클래스란

    - 클래스 안에 선언된 클래스

    - 특정 클래스 내에서만 주로 사용되는 클래스를 내부 클래스로 선언한다.

    - GUI어플리케이션의 이벤트 처리에 주로 사용된다.


   - 내부 클래스의 장점

     - 내부 클래스에서 외부 클래스의 멤버들을 쉽게 접근할 수 있다.

     - 코드의 복잡성을 줄일 수 있다.(캡슐화)


  8.2. 내부 클래스의 종류와 특징

    - 내부 클래스의 종류는 변수의 선언위치에 따른 종류와 동일하다.

    - 유효범위와 성질도 변수와 유사하므로 비교해보면 이해하기 쉽다.


  8.3. 내부 클래스의 제어자와 접근성

    - 내부 클래스의 접근제어자는 변수에 사용할 수 있는 접근제어자와 동일하다.


  - static 클래스만 static멤버를 정의할 수 있다.


 8.3. 내부 클래스의 제어자와 접근성

   - 내부 클래스도 외부 클래스의 멤버로 간주되며, 동일한 접근성을 갖는다.


  8.3. 내부 클래스의 제어자와 접근성

    - 외부 클래스의 지역변수는 final이 붙은 변수(상수)만 접근 가능하다.

    - 지역 클래스의 인스턴스가 소멸된 지역변수를 참조할 수 있기 때문이다.


 8.4. 익명 클래스

   - 이름이 없는 일회용 클래스. 단 하나의 객체만을 생성할 수 있다.


'프로그램 이론 > JAVA' 카테고리의 다른 글

[JAVA]lang패키지  (0) 2018.05.24
[JAVA]예외처리  (0) 2018.05.24
[JAVA]객체지향언어의 개념 - 1  (0) 2018.05.20
[JAVA]배열(Array)  (0) 2018.05.20
[JAVA]조건문과 반복문  (0) 2018.05.20