본문 바로가기
Studynote/Computer Science 12

09.23 제 7장 객체지향프로그래밍2-2

by e.sunie 2018. 11. 5.

[제어자(Modifier)]

- 접근 제어자와 그 외의 제어자로 구분

- 접근제어자: public, protected, private, default

- 그 외 제어자 : static, final, abstract, native, transient, synchronized, volatile, strictfp

- 클래스, 변수, 메소드의 선언부에 부가적인 의미 부여하도록 사용함.

- 여러개가 함께 조합으로 활용될 수 있음.

- 순서는 상관없으나 통상 접근제어자를 제일 머저 표기

- 접근제어자 4개 중 하나만 선택해야함(예로 public private처럼 함께 사용 불가)


⦁static 

- 클래스 공통이라는 의미로 클래스 변수, 클래스 메소드 등으로 사용

- 클래스 변수는 1개의 값을 공유 (인스턴스 변수와 대응된다)

- 클래스 메소드는 인스턴스 메소드 보다 편리하고 속도가 빠르다.


⦁final

- 마지막, 변경 불가라는 의미

- 변수의 경우 상수값으로 고정되어 변경이 불가

- 메소드의 경우 오버라이딩 불가

- 클래스의 경우 자식 클래스로 확장 불가


-생성자를 이용한 final 맴버변수 초기화

final int NUMBER = 7;

모든 카드의 넘버가 7로 고정


카드의 넘버를 바꾸고 싶다면 어떻게 해야하나?

1. final사용

2. 초기화시키는 부분을 구분


final int NUMBER;  //생성자를 이용한 final

 

Card(int num) {  //변수의 초기화

        NUMBER = num;

}


-static과 비교하여 생각하라

static 변수는 값이 변할 수 있다. but 인스턴스마다 똑같다.

final 변수는 인스턴스마다 다른 값을 가질 수 있다. but 고정값이다.





⦁abstact 

- 추상적 틀, 미완성이라는 의미

- 실제 수행해야할 내용은 추후에 정의하고 여기에서는 선언부만 작성한다는 의미

- 메소드 앞에 붙으면 선언부만 정의하고 구체적인 내용은 상속클래스에서 정의한다는 뜻

- 클래스 앞에 붙으면 클래스에 추상메소드가 있다는 뜻을 나타낸다.


⦁ 접근 제어자(Aceess Modifier)

- public, protected, default, private

- 맴버와 클래스에 사용하여 외부로부터 접근을 제한

- default 접근제어자는 아무 수식어가 명시되지 않을 때

- 접근제어자가 사용될 수 있는 곳 : 클래스, 맴버 변수, 메소드, 생성자

제어자

같은 클래스

같은 패키지

자손클래스

전 체

public

 

 

 

 

protected

별로잘안씀

 

 

 

default

 

 

 

 

private

 

 

 

 

대 상

사용가능한 접근 제어자

클래스

public,, (default)

메서드

public, protected, (default), private

맴버변수

지역변수

NONE


class Time

{

        private int hour; // 클래스 내에서 자유롭게 변경하고 싶을 경우 private을 쓴다

        private int minute;

        private int second;

        

        Time( int h, int m, int s) {

                hour = h;

                minute = m;

                second = s;

        }

 

        //setter 함수를 통해 값을 변경

        void setHour(int h) {

                if( h< 24 && h>=0)

                        hour = h;      

        } //접근제어뿐만아니라 함당하게 변경가능)

        

        public String toString() {

                return hour + ":" + minute + ":" + second;

        }

        // 재정의하여 이용함 (원래 toString은 주소값만 리턴하는 역할!)

}

 

class TimeTest

{

        public static void main(String[] args)

        {

                Time t = new Time(12, 25, 40);

                t.setHour(52);

                System.out.println(t);

        }

}

 



⦁자료 은닉(Data hoding)

- 캡슐화

- private를 이용하여 외부의 접근을 차단하여 데이터 보호

- 또는 외부 노출이 불필요하거나 내부저긍로 사용이 한정된 경우에 사용함.

- 타당성 테스트를 통해 올바른 값이 배정이 된다.


대 상

사용가능한 접근 제어자

클래스

public,, (default), final, abstract

메서드

모든 접근제어자, final, abstract, static

맴버변수

모든 접근제어자, final, static

지역변수

final

⦁제어자의 조합


- static abstract 메소드는 없다 WHY?abstract는 내용이 없고 static은 내용이 고정(모순)

- private final 메소드는 없다.

- private abstract 메소드는 없다

- abstract final 클래스는 없다




[다형성(polymorphism)]

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

- 하나의 참조변수로 여러 타입의 객체를 kcawh할 수 있는 것

- 즉, 조상타입의 참조변수로 자손타입의 객체를 다룰 수 있는 것이 다형성이다.






⦁참조변수의 형변환

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

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



fe2.water() - 강제적 형변환을 통해 가능


class Car

{

        String color;

        int door;

        void drive() { System.out.println("Drive");}

        void stop() { System.out.println("Stop");}

}

 

class FireEngine extends Car

{

        void water() {System.out.println("Water");}

}

 

class Ambulance extends Car

{

        void siren() {System.out.println("Siren");}

}

 

class CarTest

{

        public static void main(String[] args)

        {

                Car car = null;

                FireEngine fe = new FireEngine();

                FireEngine fe2 = null;

                fe.water();

                car = fe;

                //car.water(); 에러! car는 Car에 속하기에 water기능을 할 수 없다.

                fe2 = (FireEngine)car;

                fe2.water();

        }

}

 


댓글