* 상속의 정의와 장점

 - 기존의 클래스를  재사용해서(상속받아) 새로운 클래스를 작성하는

 - 두 클래스를 조상과 자손으로 관계를 맺어주는 것 (extends 키워드 사용)

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

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

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

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

 - 자바는 단일상속만 허용한다.(C++ 은 다중상속 허용) 

 

class Point {

int x ;

int y ;                      

}

class Point3D extends Point { // Point 클래스를 상속 받아 x, y를 모두 사용 할 수 있고

      int z ;                            // z멤버 변수를 추가로 선언

}

 

▶ 포함(composite) 이란?

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

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

class Point {

int x ;

int y ;                      

}

 

class Circle {

int x ;   //원점의 x좌표               class Circle { 

int y ;  // 원점의 y좌표      ---->     point c = new Point(); // 원점

int r ;  // 반지름(radius)                 int r ;                        // 반지름(radius)

}                                                   }

 

 

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

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

 

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

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

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

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

 

* 오버라이딩(overrriding)이란? 

 - 조상클래스로 상속받은 메서드의 내용을 상속받은 클래스에 맞게 변경하는 것

 - override - '~위에 덮어쓰다(overwrite).' '~에 우선하다'int x ;

class Point {

int x;

int y;

 

String getLocation () {  // 조상 메서드

return " x : " + x + ",y : "+ y;

}

}

 

class Point3d extends Point {

int z;

 String getLocation () {  // 조상 메서드를 상속받아 메서드를 내용을 변경 -> 오버라이딩

return " x : " + x + ",y : "+ y;, z : " + z ;

 }

}

 

-> 오버라이딩의 조건

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

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

     - 조상 메서드가 protected라면  범위가 같은 protected 나 public으로만 변경  가능

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

 4. static메서드를 인스턴스 매서드로, 또는 그반대로 오버라이딩 할 수 없다.

-> 오버로딩 VS. 오버라이딩(비교)

 * 오버로딩(over loading) - 기존에 없는 새로운 매서드를 정의하는 것 (new)

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

 

class Parent {

void parentMethod() {}

}

class Child extends Parent {

void parentMethod() { }      // 오버라이딩

void parentMethod(int i) { } // 오버로딩

 

void childMethod() { }

void childMethod(int i) { }   // 오버로딩

void childMethod() { }        // 에러!!! 중복정의 임 

 

-> 참조변수 (super)

 

this - 인스턴스 자신을 가르키는 참조변수, 인스턴스 주소가 저장되어 있음 모든 인스턴스 메서드에 지역변수로

             숨겨진 채로 존제

super - this와 같은 역활  조상의 멤버와 자신의 맴버 구별하는 데 사용.

 

super() - 조상의 생성자

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

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

 

Oject클래스를 제외한 모든 클래스의 생성자 첫 줄에는 생성자(같은 클래스의 다른 생성자 또는 조상의 생성자) 를 호출해야한다.

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

 

* 패키지(package)

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

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

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

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

 

->패키지의 선언

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

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

 

* import

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

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

 - import문의 선언

  import 패키지명.클래스명 ;

  또는

  import 패키지명.*;     // 이렇게 선언하여도 프로그램 성능에 아무런 영향을 미치지 않는다.

                               // import문은 컴파일 시에 처리가 됨

 

- 이름이 같은 클래스가 속한 두 패키를 import 할 때는 클래스명 앞에 패키지명을 붙여야함

 

 

 

'JAVA' 카테고리의 다른 글

자바의 객체지향개념 2-3  (0) 2015.10.18
자바의 객체지향개념 2-2  (0) 2015.10.05
자바의 객체지향개념 1-3  (0) 2015.10.05
자바의 객체지향개념 1-2  (0) 2015.10.05
자바의 객체지향개념 1-1  (0) 2015.10.05
Posted by 달콤한부자
,

* 생성자(constructor) 란?

 - 인스턴스가 생성될 때마다 호출되는 '인스턴스 초기화 메서드'

 - 인스턴스 변수 초기화 또는 인스턴스 생성시 수행잘 작업에 사용

 - 몇가지 조건을 제외하고 메서드와 같다.

 - 모든 클래스에는 반드시 하나 이상의 생성자가 존재 하여야 한다.

 - 생성자는 주로 객체의 멤버변수를 초기화 하는데 사용(멤버변수는 일반적으로 생성자에서 초기화)

 

 # 인스턴스 초기화 - 인스턴스 변수에 적절한 값을  저장하는 것

 Card c = new Card();

1. 생성자 new에 의해서  메모리(heap)에 Card클래스의 인스턴스가 생성

2. 생성자 Card()가 호출되어 수행된다.

3. 연산자 new의 결과를 , 생성된 Card인스턴스의 주소가 반환되어 참조변수 c에 저장

 

 

-> 생성자의 조건

 - 생성자의 이름은 클래스의 이름과 같아야 한다

 - 생성자는 항상 리턴값이 없습니다. 그렇다고 리턴값이 없음을 의미하는 void를 붙이지는 않는다.

래스이름(타입 변수명, 타입 변수명, ... ) {

  // 인스턴스 생성시 수행될 코드

     // 주로 인스턴스 변수의 초기화 코드를 적는다.

}

 

-> 기본 생성자(default constructor)

 -  매개변수가 없는 생성자

 -  클래스에 생성자가 하나도 없으면 컴파일러가 기본 생성자를 추가한다.

     (생성자가 하나라도 있으면 컴파일러는 기본 생성자를 추가하지 않는다.)

 

 클래스이름() { }

 Card() { } // 컴파일러에 의해 추가된 Card클래스의 기본 생성자. 내용이 없다.

 

-> 생성자에서 다른 생성자 호출하기 _this()

 ▶ this() - 자기 자신을 가르키며 , 생성자, 같은 클래스의 다른 생성자를 호출 할 때 사용

                   다른 생성자 호출은 생성자의 첫줄 에서만 가능

class Car {

String color;

String gearType;

int door;

 

Car() { this("white","auto","4" } // 매개변수가 없는 생성자(기본 생성자)

 

Car(String c, String g, int d) {  //매개변수가 있는 생성자 (생성자를 통한 멤버변수 초기화)

color = c ;

gearType = "auto"

door = 4 ;

 

       Car() {

door = 5;

this("white","auto",4);

}

-> 참조변수 this

 ▶ this 인스턴스 자신을 가리키는 참조변수.인스턴스의 주소가 저장되어 있음

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

 

clss Car {

String color;

String gearType;

int door;

 

Car() {

 this("white","auto","4");

}

 

car(String c, String g, int d){

color = c;

gearType = g;

door = d;

} 

}

// 위 car 생성자를 this를 이용하여 변경

car(String c, String g, int d){

this.color = color;

this.gearType = gearType;

this.door = door;

}

 

* 변수의 초기화

 - 변수를 선언하고 처음으로 값을 저장하는 것

 - 맴버변수(인스턴스변수, 클래스변수) 와 배역을 각 타입의 기본값으로  자동 초기화되무로 초기화 생략 가능

 - 지역변수는 사용전에 꼭!! 초기화를 해주어야 한다.

 

 자료형

기본값 

 boolean

false 

 char

'\u0000' 

 byte

 short

 0

 int

 0

 long

0L 

 float

0.0f 

 double

0.0d 또는 0.0 

 참조형 변수

null 

 

 class InitTest{

     int x;            // 인스턴스 변수

     int y = x ;     //  인스턴스 변수

 

     void method1() {

int i ;        // 지역변수

      int j = i;     // 컴파일에러 !!!! 지역변수를 초기화하지 않고 사용함

 

 

-> 변수의 초기화 예시

 선언예

설명 

 int i = 10 ;

 int j = 10 ;

 int형 변수 i를 선언하고 10으로 초기화 한다.

 int형 변수 j를 선언하고 10으로 초기화 한다.

 int i = 10, int j = 10 ;

 같은 타입의 변수는 콤마(,)를 사용해서 함께 선언하거나 초기화 할 수 있다. 

 int i = 10 , j = 10 ;

 타입이 다른 변수는 함께 선언하거나 초기화할 수 없다. 

 int i =10 ;

 int j = i ;

 변수 i에 저장된 값으로 변수 j를 초기화 한다.

 변수 j는 i의 값인 10으로 초기화 한다. 

 int j= i ;

 int i= 10;

 변수 i가 선언되기 전에 i를 사용 할 수 없다. 

 

-> 멤버변수의 초기화

▶ 멥버변수의 초기화  3가지 방법

 1. 명시적 초기화

class Car {

int door = 4;                           // 기본형 변수의 초기화

Engine e = new Engine() ;     //  참조형 변수의 초기화

//....

}

 2. 생성자(constructor)

 - this를 이용한 맴버변수의 초기화

 car(String color, String gearType, int door){

this.color = color ;

this.gearType = gearType;

this.door = door ;

     }

 

 3. 초기화 블럭

  - 인스턴스 초기화 블럭 : { }

  - 클래스 초기화 블럭 : static { }

'JAVA' 카테고리의 다른 글

자바의 객체지향개념 2-2  (0) 2015.10.05
자바의 객체지향개념 2-1  (0) 2015.10.05
자바의 객체지향개념 1-2  (0) 2015.10.05
자바의 객체지향개념 1-1  (0) 2015.10.05
본문 한글깨짐 문제 해결방법  (0) 2015.09.22
Posted by 달콤한부자
,

* 변수 선언위치에 따른 변수의 종류

- 변수의 선언위치가 변수의 종류와 범위(Scope)을 결정한다.

 

변수의 종류 

선언위치 

생성시기 

 클래스 변수

 클래스 영역

 클래스가 메모리에 올라갈 때 

 인스턴스 변수

 클래스 영역

 인스턴스를 생성시

 지역변수

 메서드 영역 

 변수 선언문 수행시

 

-> 인스턴스 변수

- 각 인스턴스의 개별적인 저장공간 인스턴스마다 다른 값 저장가능

- 인스턴스 생성 후,'참조변수.인스턴변수명'으로 접근

- 인스턴스를 생성할 때 생성되고, 참조변수가 없을 때 가비지 컬렉터에 의해 자동 제거

 

->클래스 변수

-같은 클래스의 모든 인스턴스들이 공유하는 변수(Static)

-인스턴스 생성없이 '클래스이름.클래스변수명' 으로 접근

-클래스가 로딩될 때 생성되고 프로그램이 종료될 때 소멸

 

-> 지역변수

- 메서드 내에 선언, 메서드 종료와 함께 소멸

- 조건문, 반복문의 블럭{} 내에 선언된 지역변수는 블럭을 벗어나면 소멸

 

* 메서드란?

 - 작업을 수행하기 위한 명령문의 집합

-  어떤 값을 입력받아서 처리하고 그 결과를 돌려준다(돌려주지 않을 수도 있다. void)

 

-> 메서드의 정의 - 클래스 영역에만 정의 할 수 있다.

리턴타입 메서드의 이름(타입 변수명, 타입 변수명,....){

            // 메서드 호출시 수행될 코드

 

 

int add(int a , int b){

int result = a+b;

return result; // 호출한 메서드로 결과를 반환한다. 

                  // 반환값이 없는 경우는 리턴타입 대신 void 사용

-> return 문

- 메서서드의 블럭 {}의 끝에 도달했을때

- 메서서드을 블럭 {}을 수행 도중 return문을 만났을때

- 현재 실행 중인 메서드를 종료하고 호출한 메서드로 되톨아 간다.

 

1. 반환값이 없는 경우 - return문만 써주면 된다

           return;

2. 반환값이 있는 경우 - return문 뒤에 반환값을 지정해 주어야 한다.

          return 반환값;

 

-> 재귀호출(recursive call)

 - 메서드 내에서 자기 자신을 반복적으로 호출하는 것

 - 재귀호출은 반복문으로 바꿀 수 있다.

 - 이해하기 쉽고 간결한 코드를 작성할 수 있다.

 

-> 클래스 메서드 와 인스턴스 매서드

 ▶ 인스턴스 메서드

  - 인스턴스 생성후, '참조변수.메서드의이름()'으로 호출

  - 인스턴스변수 나 인스턴스메서드와  관련된 작업을 하는 메서드

  - 메서드 내에서 인스턴스변수 사용가능

 

 ▶ 클래스  메서드(static 매서드)

  - 객체생성없이 '클래스이름.메서드이름()'으로 호출

  - 인스턴스변수나 인스턴트메서드와 관련없는 작업을 하는 메서드

  - 매서드 내에서 인스턴스 변수 사용불가(클래스 메서드(클래스 변수)는 클래스가  메모리에 먼저 올라 오기 때문)

 

* 메서드 오버로딩

 - 하나의 클래스에 같은 이름의 메서드를 여러 개 정의하는 것

 

->오버로딩의 조건

 - 메서드의 이름이 같고

 - 매개변수의 개수 또는  타입 달라야 함

 - 매개변수는 같고 리턴타입이 다른 경우는 오버로딩이 성립되지 않는다. 

 

 ex) void println() 

 // 다양하게 오버로딩된 메서를 제공함으로써 모든 변수를 출력할 수 있도록 설계

 

 

'JAVA' 카테고리의 다른 글

자바의 객체지향개념 2-1  (0) 2015.10.05
자바의 객체지향개념 1-3  (0) 2015.10.05
자바의 객체지향개념 1-1  (0) 2015.10.05
본문 한글깨짐 문제 해결방법  (0) 2015.09.22
eclipse 단축키(Hot key)  (0) 2015.07.16
Posted by 달콤한부자
,