본문 바로가기

Java/Java_OOP 3(object_oriented Programming)

Java_OOP 3( object_oriented Programming ) 객체지향적 프로그래밍

반응형

1. 상속 ( inheritance )

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

 - 보다 적은 양의 코드로 새로운 클래스를 작성

 - 코드를 공통적으로 관리할 수 있기 때문에 코드의 추가 및 변경이 매우 용이

 

  * 특징 

 - 코드 재사용성을 높이고 코드의 중복성을 제거하여 프로그램의 생산성과 유지보수에 크게 기여

 

  * 방법

 - 클래스 이름뒤에 상속받고자하는 클래스의 이름 뒤에 'extends'

ex)    class 클래스명 extends 조상클래스 { ... }

 

 

*  조상 클래스 - 부모(parent)클래스, 상위클래스(super)클래스, 기반(base)클래스

*  자손 클래스 - 자식(child)클래스, 하위(sub)클래스, 파생된(derived)클래스

 

- 생성자와 초기화 블럭은 상속되지 X

- 멤버만 상속 

- 자손클래스의 멤버 개수는 조상 클래스보다 같거나 많다.

- 자손 클래스의 인스턴스를 생성하면 조상클래스의 멤버와

  자손 클래스의 멤버가 합쳐진 하나의 인스턴스가 생성

 

 

 

* 상속관계 '~은 ~이다.'    ( is - a )

  - 원(Circle)은 점(Point) 이다.   -   Circle is a Point.

* 포함관계 '~은 ~을 가지고 있다.'   ( has - a )

  - 원(Circle)은 점(Point) 이다.   -   Circle has a Point.

 

 

* 단일 상속(single inheritance)

 - 자바에서는 단일 상속만을 허용.  ex)  class loapin extends  loa,  pin  {  ... }  // 에러 발생  (조상은 하나만 허용)

 

* 다중상속문제점

 - static 메서드라면 클래스의 이름이 붙어서 구별할 수있지만

   인스턴스는 클래스 내에서 선언부(이름, 매개변수) 만 같고 다른 내용의 메서드를 구분하기 때문에 힘들다.

 

 

** 모든 클래스의 조상  -  object 클래스

 

 

 

 

 

- 책체를 생성할 때 자동으로 생성자를 만들어주기 때문에 에러가 발생한다.

- 매개변수가 있는 생성자가 있을 때는 자동으로 기본 생성자를 만들어주지 않는다.

  (위에서는 존재하지 않는 생성자를 호출한다.)

- 해결하기 위해서는 기본생성자를 오른쪽과 같이 추가해주야 한다. 

 

 

 

2. 오버라이딩(overriding)

 - 조상 클래스로부터 상속받는 메서드의 내용을 변경하는 것

 

* 조건 

 - 자손 클래스에서 오버라이딩하는 메서드는 조상 클래스의 메서드와 

    ㄱ. 이름이 같아야 한다.

    ㄴ. 매개변수가 같아야 한다. 

    ㄷ. 반환타입이 같아야 한다.

요약) 선언부가 서로 일치해야 한다. 다만! 접근 제어자(access modifier)와 예외(exception)는

        제한된 조건 하에서만 다르게 변경할 수 있다.

 

 * 조상 클래스의 메서드를 자손 클래스에서 오버라이딩할 때 

  - 접근 제어자를 조상 클래스의 메서드보다 좁은 범위로 변경할 수 X

  - 예외는 조상 클래스의 메서드보다 많이 선언할 수 X

  - 인스턴스메서드를 static메서드로 또는 반대로 변경할수 X

 

* 조상 클래스에 정의된 static메서드를 자손클레서에서 똑같은 이름의 static메서드로 정의할 수 있다.

 

 

 

**오버로딩(overloading) vs 오버라이딩(overriding)

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

  - 오버라이딩(overriding)  =  상속받은 메서드의 내용을 변경하는 것 (change, modify)

 

* 결론

  - 오버로딩    - 같은이름 다른메소드에 의해서 여러개의 같은이름의 메소드들을 정의할수있는것
  - 오버라이딩 - 부모클레스,자식클레스가 있을때 부모클레스에있는 메소드를 메소드의 이름, 매개변수형식, 리턴타입이 같은 메소드들을 자식클레스에서 정의한것을 통해서 부모클레스를 부모클레스에 있는 메소드를 상속받지 않고 자식클레스에서 다시 새롭게 변경하고자 할 때 사용하는 개념

 

 

 * super 

  - 자식 클래스에서 상속 받은 부모 클래스의 멤버변수를 참조할때 사용

  - super() 는 부모의 생성자를 의미

  - 부모의 생성자를 임의로 호출하지 않으면, 부모 class의 기본 생성자가 자동 호출

  - 자식클래스의 생성자에서 super을 사용할 때 주의점은 super가 가장먼저 나타나야 한다.

    (부모가 초기화되기 전에 자식이 초기화 하는 일을 방지하기위한일) 

 

 * this

  - 현재 클래새의 인스턴스를 의미

  - 클래스의 멤버변수를 지정할때 사용

 

 * super()

  - 자식 클래스가 자신을 생성할 때 부모 클래스의 생성자를 불러 초기화 할 때 사용.

    (기본적으로 자식 클래스의 생성자에 추가)

 

* this() 

  - 현재 클래스에 정의된 생성자를 부를때 사용

 

 

 자신을 가리키는 키워드  this        !=        부모를 가리키는 키워드는 super

 

 

 * Object클래스를 제외한 모든 클래스의 생성자 첫 줄에 생성자 this(), super() 를 호출해야한다.

그렇지 않으면 컴파일러는 자동적으로 super()를 생성자의 첫 줄에 삽입한다.

 

 

3. package & import

 * 패키지(package)

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

  - 클래스 또는 인터페이스를 포함시킬 수 있다.

  - 서로 관련된 클래스들을 효율적으로 관리할 수 있게  단위로 묶은 것

  - 클래스가 물리적으로 하나의 클래스파일( .class )인 것과 같이 패키지는 물리적으로 하나의 디렉토리

  - 점( . ) 을 구분자로 하여 계층구조로 구성할 수 있다.

  - package 선언 형식  =package 패키지명 ;

 

 * import

  - 사용하고자 하는 클래스의 패키지를 미리 명시해주면 소스코드에 사용되는 패키지명을 생략할 수 있다.

  - 프로그램의 성능에 전혀 영향을 미지지 X

  - 많이 사용하려면 컴파일 시간이 쪼~끔 더 걸림 뿐

 

 

4. 제어자(modifier)

   - 접근 제어자(access modifier)    = 접근지정자 + 기타제어자 

       - class 앞에 접근지정자와 메서드 앞에 접근지정자와 다르다. 
       - 중첩 클레스 =  class 안에 class를 선언

   - 클래스의 내부에 선언된 데이터를 보호하기 위해

 

  * 접근사 사용 이유

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

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

 

  * 멤버 앞에 붙는 접근제어자(지정자)   -  사용할 수 있는 곳 클레스 앞, 멤버(필드 앞, 메서드 앞, [생성자 앞])  
    1) public - 접근 제한이 없다. (다른 패키지) 
    2) default - 같은 패키지 내에서만 접근이 가능하다.  
     ( int y ) 
    3) private - 같은 클레스 내에서만 접근이 가능하다.  
    4) protected - default + 상속( 자속 클레스내에서 접근가능)

 

  * 접근지정자 ( access modifiers)

   1) public  - 같은 패키지, 다른패키지에서도 클래스를 사용(참조, 상속)할 수 있다. 
   *) import 구문은 설정해줘야한다.  
   2) (package == default) - 같은 패키지 내에서만 사용(참조, 상속)할 수 있다.  
  - 중첩클레스를 선언할때[만] 사용(private,protected) 
   3) private  (비활성화) - 같은 [파일 내]에서 상속, 참조 가능 
   4) protected (비활성화) - 같은 [패키지 내]에서 상속, 참조 가능    + 다른 패키지에서 상속만 가능 

 

  * 기타제어자 
   1) abstract : 추상 클레스  
   2) final  : 최종(마지막) 클레스  
   3) static  (비활성화) : 정적(static) 클레스  - 중첩클레스에서 사용할 수 있다. 

 

-> x를제외 한 나머지값 오류 

 

  접근 범위가 넓은 쪽에서 좁은쪽순 

  -  public > protected > (default) > private 

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

 

* 제어자(modifier)의 조합

  - 메서드에 static과 abstract를 함께 사용할 수 X

  - 클레스에 abstract 와 final을 동시에 사용할 수 X

  - abstract메서드의 접근 제어자가 private일 수 X

  - 메서드에 private 와 final을 같이 사용할 필요는 X

 

 

 

● static

  - 인스턴스변수는 하나의 클래스부터 생성되었다가도 각기 다른 값을 유지하지만

  - 클래스변수(static멤버변수)는 인스턴스에 관계없이 같은 값을 갖는다. 

/* 이유는 하나의 변수를 모든 인스턴스가 공유하기 때문에  */ 

  - static이 붙은 멤버변수와 메서드 , 초기화블럭은 인스턴스가 아닌 클래스에 관계된 것이기 때문에

    인스턴스 생성하지 않고 사용할 수 있다.

  - 클래스 안에 필드를 클래스변수(static변수)로 선언해서 사용하는 이유?  =  모든 인스턴스가 공유할 변수(필드)가 필요하다면...

 

   클래스 변수 == 공유변수  ==  shared 변수 == 정적변수  ==  static변수

* static 키워드 getter  , setter

   - 쓰기전용의 필드로 선언 . setter  읽기 전용의 필드로 선언 . getter 
 

* private 막아두고 getter,setter 를 사용해 접근 하는방법 ?
   ㄱ. 만약에 그 필드가 읽기 전용,쓰기전용 한가지로 사용할 때. 

   ㄴ. 유효한 데이터를 private에 설정하기 위해.

 

● final 

 * fonal

  - 변경될 수 없는 의미를 가지고 있으며 거의 모든 대상에 사용될 수 있다.

  - 사용 가능한 곳 : 클래스, 메서드, 멤버변수, 지역변수

 

● abstract

 * abstract

  - '미완성' 의미

  - 메서드의 선언부만 작성하고 실제 수행내용은 구현하지 않은 추상 메서드를 선언하는데 사용

  - 사용 가능한 곳 : 클래스, 매서드

 

 

 

반응형