본문 바로가기

콩's EDUCATION/콩's JAVA

[KITRI] 자바 7장 : 객체지향 프로그래밍 2차

7장. 객체지향 프로그래밍 2차


 

* 객체 지향 특징

 

반복 코드 최대한 줄임.

 

[m] class 회사원 extends 사람{

사번, 급여

//밥먹다 메소드

//잠자다 메소드

일하다 메소드

}

 

1. 회사원 사람"이다".

==> 상속 관계; is -a 관계성립 ; class 회사원 extends 사람

 

2.

class 자동차{

시동걸다(){}

전진하다(){}

후진하다(){}

}

 

 

운전자는 자동차 "이다" (X)

운전자는 자동차를 가지고 있다

==> 포함관계;  has -a 관계성립 ;

 

clss 운전자{

운전하다(){}

자동차 car = new 자동차(); // 변수

}

 

* 캡슐화 구조 만족

 

데이터 + 기능묶음 == Class

 

* 상속(inheritance) 구문

 

1. 변수나 메소드들은 하위클래스 자동 포함 사용 가능

2. prvate 변수나 메소드들은 하위 클래스 포함 사용 불가능

3. 상위 변수나 메소드들 이름이 하위 변수나 메소드들의 이름과 동일할 경우

하위클래스 변수나 메소드가 우선적 인식이 가능

(상위클래스 상속 동일명 변수나 메소드 : super 키워드 사용

 

class 사람{

이름, 나이, 변수

잠자다 메소드

밥먹다 메소드

}

회사원은 사람을 상속받는다

사람 자동 포함 ; 추가 변수와 메소드만 정의한다.

[m] class 회사원 extends 사람{

사번, 급여

//밥먹다 메소드

//잠자다 메소드

일하다 메소드

}

clas 학생 extends 사람{

학번, 성적

//밥먹다 메소드

//잠자다 메소드

공부하다 메소드

}

 

사람 = parent, super 클래스

회사원, 사람 = chile, sub 클래스

 

classA{i변수,j,ma()}

classB{i,k,mb()}

classC extends A,B{ ==> 자바는 다중 상속 불가능

A클래스 i=10, B클래스 i=20

C클래스에서 i값을 알 수 없다.

==> interface 를 사용하면 해결한다.

i 변수, j, mㅁa()

i,k,mb()

S.O.P(i);

 

* 다른 클래스 변수 사용 방법

 

class A{i}

class B{

A클래스 i변수 사용

A a1 = new A(); ==> 1. 객체 생성

a1.i

}

class C extends A{

A클래스 i 변수 사용 ==> 2. 상속

i출력

 

* 패키지

 

TIP : 자동임포트 단축어  ==> CTRL+SHIFT+O

 

* Modifier

public 상태클래스

no modifier = default = 기본 클래스

 

no modifier 클래스 ; 현재 패키지 내부 사용 가능(외부 패키지 안보임)

 

public ; 자바 모든 클래스에서 사용가능

private ; 현재 클래스에서만 사용가능

protected ; 현재 패키지 + 다른 패키지의 상속받은 클래스에서만 사용가능

 

* 다형성(polymorphism)

 

같은 이름 호출 ; 여러가지 결과

 

메소드 오버로딩(overloading;과적하다)

같은 이름의 메소드로 같은 기능을 구현하되 매개변수 따라서 여러가지 방법 제공

하나의 클래스에 이름은 같고 매개변수 다르게 정의 메소드 여러개, 리턴 타입이나 modifier 제한은 없다.

 

Integer.parsetInt("100")

Integer.parsetInt("100", 2)

 

메소드 오버라이딩(overriding;우선시하다)

상속관계 두 클래스에 이름 같고 매개변수 같은 메소드 정의 --> 하위클래스 재정의/변경은 하위클래스가 우선된다. 리턴 타입 동일하다.

 

class A {

test(){ x; }

}

class B extends A {

test(){ x+y; }

}

class C extends A {

test(){ x+z; }

}

 

B b1 = new B();

b1.test() == x+y

C c1 = new C();

c1.test() == x+z

 

modifier 같거나 더 넓어야 한다.

private < no modifier(=default) < protected < public

 

* 다형성의 다양한 점

 

객체 형변환 

1. 상속관계 클래스

 

2. 자동형변환

 

하위 객체 생성하여 상위 클래스 변환

상위클래스명 변수1 = new 하위생성자()

 

이유? 서로 다른 여러개 객체들 타입을 통일하기 위해서 사용한다.

 

Book[] booklist = new Book[];

A list[] = new A[4]; ==> A,B,C,D

list[0] = new A();

list[1] = new B(); ==> 자동형변환 발생

list[2] = new A();

list[3] = new A();

 

예) 메소드 매개변수

 

A list = new A();

 

3. 명시적형변환

 

class A{i, ma()}

class B extends A{i,ma()+j.mb()}

class C extends A{}

class D extends B{}

 

A a2 = new B(); ==> 자동 형변환 가능

A a3 = new C(); ==> 자동 형변환 가능

A a4 = new D(); ==> 자동 형변환 가능

B b1 = new D(); ==> 자동 형변환 가능

 

B b2 = new C(); ==> 자동 형변환 불가능

C c1 = new D(); ==> 자동 형변환 불가능

B b3 = new A(); ==> 자동 형변환 불가능 (반대여야 가능하다)

 

B객체 생성하여 A 타입처럼 사용 가능

= A클래스의 변수나 메소드 모두 사용 가능

 

=: 기본형 변수 형변환

int i = 10;

int j = 20;

double d = 30.0;

 

i = j;(j값을 i 복사 전달 : 크기, 타입동일)

i = (int)d; ==> 형변환

 

기본형 변수

1. boolean 제외

2. 자동형변환 ; 형변환 연산자 생략

byte-short-int-long-float-double

char-int-long-float-double

3. 자동형변환 이후 접근 가능한 멤버변수나 메소드

 

Parent p2 = new Child1();

 

p2.멤버변수 ===> Parent 클래스 변수 O

Child1 클래스 변수 X

 

p2.non-overriding 메소드

===> parent 클래스메소드 O

child 클래스 메소드 x

 

p2.overriding 메소드

===> child1 클래스 메소드 O

 

4. 명시적 형변환 ; 연산자 생략 없는 경우, 형변환 연산자 필수!

 

자동형 변환되었다가 다시 원래의 하위 타입 재변환일 때 사용한다.

 

class B extends A{}

Aa1 = new B();

a1.멤버변수

a1.메소드

==> A

a1.overriding 메소드

==> B

형변환 되기 이전의 원래의 객체 포함 메소드 변수 사용

원래 타입 변환

A a1 = new B(); ==> 자동 형변환

B b1 = (B)al;   ==> 명시적 형변환

b1.멤버변수

B b2 = (B)newA(); ==> 명시적 형변환 오류

 

* this와 super

 

this ; 현재 자신 객체 키워드

this.멤버변수 ; 매개변수와 멤버변수 이름 동일 구분

this.멤버변수 ; 지역변수와 멤버변수 이름 동일 구분

this([매개변수]); 자신 객체 다른 생성자 호출(생성자 overloading 시에)

 

super ; 상위클래스 객체 키워드
super.멤버변수 ; 상위, 하위클래스 동일면 변수 상위클래스 변수 구분

super.메소드명(); 상위, 하윜르래스 동일명 메소드(메소드 오버라이딩) 상위클래스 메소드 구분 ==> 장점 ; 반복 정의하지 않고도 호출, 코드 재사용성 높인다.

 

* 생성자 호출

 

this([매개변수]); 자신 객체 다른 생성자 호출(생성자 오버로딩 시에)

super(); 상위 기본 생성자 호출

==> 생성자 내부 첫문장 super() "자동"정의

super(매개변수); 상위 매개변수 정의 생성자 호출

==> 생성자 내부 첫문장 "명시적" 정의, 

    상위클래스 기본생성자 아닌 다른 매개변수 정의 생성자 호출

 

* 객체지향언어 조건

 

캡슐화와 은닉화

= class (데이터 + 기능)와 modifier

 

* static

 

static 변수 ; 모든 객체 1개 값 공유

 

* final

 

; 최종, 마지막, 더이상 수정은 없다.

final 변수 ; 변수값 수정 불가능 상수 1번만 할당

 

final 메소드 ; 메소드 수정 불가능 (메소드 overriding 금지)

final 클래스 ; 모든 메소드 오버라이딩 금지; 상속 금지 (객체생성의무화)

 

(final) class Circle{ ==> 상속 불가

반지름

final double 반지름 = 3.14;

원주율 = 1+3.14; (에러)

final void 원의면적(){

반지름*반지름*원주율

}

final void의 원의둘레(){

반지름*2*원주율

...

원주율

}

class Mycircle extends Circle 오류{
Circle c = new Circle();

c.원의면적() ==> final 이라도 호출 가능. 

}

 

* abstract

 

abstract 메소드 ; 선언부만 있고 구체적 구현 없는 메소드 앞 선언

 메소드 overriding 의무화

abstract 클래스 ; abstract 메소드 1개 이상 포함 클래스 앞

 상속 의무화

 구체적 결정 없다 ; 하위클래스 구체적 구현 일임 한다.

==> 여러개 클래스에 공통 기능 명세서, 스펙 제공한다.

 

// 프로젝트 팀장

; 여러개 클래스 '공통적' 기능 (구현 다르다) 선언

  여러개 클래스 '공통적' 기능 구현 같다 ==> 클래스내 선언

abstract class 도형{

abstract void 면적();

abstract void 둘레();

void 출력(){면적 둘레 출력합니다 구현}

}

class 사각형 extends 도형{

도형 모든 메소드 자동 포함

// abstract 사용 메소드는 반드시 overriding 해야한다.

(abstract) void 면적(){가로*세로};

(abstract) void 둘레(){2*(가로*세로)};

}

class 원 extends 도형{

(abstract) void 면적(){반지름*반지름*파이};

(abstract) void 둘레(){2*반지름*파이)};

}

class 삼각형

 

TIP :

final abstract class A() {} ==> 당연히 에러가 난다.

private abstract class A() {} ==> 당연히 에러가 난다.

public static final double pi = 3.14 ==> 가능하다.

 

* interface

 

1. public abstract 자동선언 메소드만 존재

2. 학생 stu = new 학생(); ==> 객체 생성이 불가능하다

= 클래스 변수와 메소드 구현 메모리 저장이 불가능하므로.

3. 생성자 없다 (기본 생성자 조차도 없다)

4. public static final 자동 선언 변수

 

interface class 학생{

[abstract public 자동선언] void 공부하다(){}

[abstract public 자동선언] abstract void 점심먹다(){}

}

interface class 교직원{

abstract void 일하다(){}

abstract void 점심먹다(){}

}

 

// 점심먹다 3,4천이라면 어떤것을 선택해야 할지 불분명 하다.

// 자바는 기본적으로 다중상속 구현 안된다.

 

class 조교 implements 학생, 교직원{

일하다(){}

공부하다(){}

점심먹다(){}

// 상속받은것은 반드시 오버라이딩

// 추가 변수 메소드 생성자 정의 선택적

}

조교 s = new 조교();

s.공부하다 ; 2개 상속 "다르다"

s.일하다

 

* 객체 지향 언어 목표

 

재사용을 위해서.

 

* 객체 지향 언어 조건

 

1. 캡슐화와 정보은닉 구현 가능

class / private ~ public

2. 상속 구현 가능 ; 단일/다중(interface)

3. 다형성 표현 가능

메소드 오버로딩, 메소드 오버라이딩, 객체 형변환(여러 타입의 객체를 하나의 타입으로 가능하다)

 

 

ch7.zip