반응형

           

  JAVA Study






3. package와 import


- 패키지란 클래스의 묶음이다

: 클래스 또는 인터페이스를 포함시킬 수 있음

: 서로 관련된 클래스들끼리 그룹 단위로 묶어놓음으로써 클래스를 효율적으로 관리할 수 있음

: 패키지는 물리적으로 하나의 디렉토리

: 하나의 소스파일에 첫 번째 문장으로 단 한 번의 패키지 선언을 허용

: 모든 클래스는 반드시 하나의 패키지에 속함

: 패키지는 점(.)을 구분자로하여 계층구조로 구성가능

: 클래스 파일(.class)을 포함하는 하나의 디렉토리


- 패키지 선언

package 패키지명;

: 패키지명은 대소문자를 모두 허용하지만 클래스명과 구분하기 위해 소문자를 사용

: 모든 클래스는 반드시 하나의 패키지에 포함되어야 함, 패키지를 선언하지 않을 경우 기본으로 제공되는 'unnamed package'에 속함


- import 문

: 사용하고자 하는 클래스의 패키지를 미리 명시해줌

: 컴파일러에게 소스파일에 사용된 클래스의 패키지에 대한 정보를 제공


- import문 선언

:한 소스파일에 여러 번 선언 가능

import 패키지명.클래스명;

import 패키지명.*; // '*'은 패키지에 속하는 모든 클래스를 의미함


- static import문

: static 멤버를 호출할 때 클래스 이름을 생략할 수 있음

: 특정 클래스의 static멤버를 자주 사용할 때 편리

import static java.lang.Integer.*;  // Integer 클래스의 모든 static메서드


4. 제어자 (modifier)


- 제어자는 클래스, 변수, 메서드 선언부에 함께 사용되어 부가적 의미를 부여


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

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

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


- 하나의 대상에 대해 여러 제어자를 조합하여 사용 가능


- 접근 제어자는 한 번에 하나만 선택해서 사용가능


- static ( 클래스의, 공통적인 )
: 클래스변수는 인스턴스에 관계없이 같은 값을 가짐
: 하나의 변수를 모든 인스턴스가 공유
: static이 붙은 멤버변수와 메서드, 초기화 블럭은 인스턴스가 아닌 클래스에 관계된 것이므로 인스턴스를 생성하지 않고 사용 가능
: 인스턴스 메서드와 static 메서드의 근본적인 차이는 메서드 내에서 인스턴스 멤버를 사용하는가의 여부에 있음
: 멤버변수 / 메서드 / 초기화 블럭에서 사용 가능

- final ( 마지막의, 변경될 수 없는 )
: 거의 모든 대상에 사용될 수 있음 ( 클래스 / 메서드 / 멤버변수 / 지역변수 )
: 변수에 사용되면 값을 변경할 수 없는 상수가 됨
: 메서드에 사용되면 오버라이딩을 할 수 없게 됨
: 클래스에 사용되면 자신을 확장하는 자손 클래스를 정의할 수 없음
: 생성자를 이용한 final 멤버 변수의 초기화
- final이 붙은 변수는 상수이므로 일반적으로 선언과 초기화를 동시에 함
- 인스턴스변수의 경우 생성자에서 초기화 되도록 할 수 있음
: 클래스 내에 매개변수를 갖는 생성자를 선언하여, 인스턴스를 생성할 때 final이 붙은 멤버변수를 초기화하는데 필요한 값을 생성자의 매개변수로부터 제공받는 것

- abstract ( 추상의, 미완성의 )
: 메서드의 선언부만 작성하고 실제 수행내용은 구현하지 않음
: 클래스 / 메서드에서 사용 가능
: 클래스 - 클래스 내에 추상 메서드가 선언되어 있음을 의미
: 메서드 - 선언부만 작성하고 구현부는 작성하지 않은 추상 메서드임을 알림
: 추상 클래스는 아직 완성되지 않은 메서드가 존재하기 때문에 인스턴스를 생성할 수 없음
: 추상 클래스만으로는 쓸모가 없지만 다른 클래스가 이 클래스를 상속받아서 오버라이딩해 사용함

- 접근 제어자 ( access modifier )
: 멤버, 클래스에 사용되어 해당 멤버 또는 클래스를 외부에서 접근하지 못하도록 제한하는 역할을 함
: 클래스 / 멤버변수 / 메서드 / 생성자에서 사용됨
: private - 같은 클래스 내에서만 접근 가능
: default - 같은 패키지 내에서만 접근 가능
: protected - 같은 패키지 내에서, 그리고 다른 패키지의 자손 클래스에서 접근이 가능
: public - 접근 제한 없음
: public > protected > default > private

- 접근 제어자를 이용한 캡슐화
: 접근제어자를 사용하는 이유는 클래스의 내부에 선언된 데이터를 보호하기 위해서이다.
- 외부로부터 데이터 보호
- 외부에 불필요한, 내부적으로만 사용되는 부분을 감추기 위해
: 데이터 감추기 (data hiding) - 데이터가 유효한 값을 유지하도록 또는 비밀번호와 같은 데이터를 외부에서 함부로 변경하지 못하도록 하기 위해 외부로부터의 접근을 제한하는 것 => 객체지향의 캡슐화
: 클래스 내에서만 사용되는, 내부 작업을 위해 임시로 사용되는 멤버변수나 부분작업을 처리하기 위한 메서드 등의 멤버들을 클래스 내부에 감추기 위해

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
public class Time {
    private int hour;    // 접근 제어자를 private으로 하여 외부에서 직접 접근 불가
    private int minute;
    private int second;
 
    public int getHour() {
        return hour;
    }
    public void setHour (int Hour) {
        if (Hour <0 ||  Hour > 23return;
        this.hour = hour;
    }
 
    public int getMinute() {
        return Minute;
    }
    public void setMinute (int minute) {
        if (minute<0 ||  minute> 23return;
        this.minute= minute;
    }
 
    public int getSecond() {
        return second;
    }
    public void setHour (int second) {
        if (second<0 ||  second> 23return;
        this.second= second;
    }
}
cs


- getter 
: get으로 시작하는 메서드는 멤버변수의 값을 반환하는 일
: 멤버변수의 값을 읽는 메서드의 이름을 'get멤버변수 이름'으로 작성

- setter
: set으로 시작하는 메서드는 매개변수에 지정된 값을 검사하여 조건에 맞으면 멤버변수 값을 변경
: 멤버변수의 값을 변경하는 메서드의 이름을 'set멤버변수 이름'으로 작성

- 생성자의 접근 제어자
: 생성자에 접근 제어자를 사용함으로 인스턴스 생성을 제한할 수 있음
: 보통 생성자의 접근제어자는 클래스의 접근제어자와 같지만 다르게 사용할 수 있음
: 생성자가 private인 클래스는 다른 클래스의 조상이 될 수 없다
- 자손클래스의 인스턴스 생성 시 조상클래스의 생성자를 호출해야하는데 private이므로 호출이 불가하기 때문
: 따라서 생성자가 private인 클래스 앞에 final을 붙여 상속할 수 없는 클래스임을 알리는 것이 좋다

- 제어자 조합
: 메서드에 static과 abstract를 함께 사용할 수 없음
- static 메서드는 몸통이 있는 메서드에만 사용할 수 있음
: 클래스에 abstract와 final을 동시에 사용할 수 없음
- 클래스에 사용되는 final은 클래스를 확장할 수 없다는 의미, abstract는 상속을 통해서 완성되어야 한다는 의미이기 때문
: abstract메서드의 접근제어자가 private일 수 없음
- abstract메서드는 자손클래스에서 구현해 주어야 하는데 접근제어자가 private이면, 자손클래스에서 접근할 수 없기 때문
: 메서드에 private과 final을 같이 사용할 필요 없음
- 접근 제어자가 private인 메서드는 오버라이딩 될 수 없기 때문, 둘 중 하나만 사용해도 의미 충분히 전달됨

5. 다형성 (polymorphism)


- 상속과 깊은 관계가 있음

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

- 한 타입의 참조변수로 여러 타입의 객체를 참조할 수 있도록 함으로써 다형성을 구현

: 조상클래스 타입의 참조변수로 자손클래스의 인스턴스를 참조할 수 있도록 하는 것


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class Car{
    String color;    
    int door;    
 
    void drive() {    // 운전하는 기능
        System.out.println("drive, Brrr");
    }
    void stop() {    // 멈추는 기능
        System.out.println("stop!!");
    }
 
}
 
class FireEngine extends Car{    //소방차
    void drive() {    // 소방차운전
        System.out.println("drive,fire!!");
    }
}
 
 
class Ambulance extends Car{
    void siren() {    // 사이렌 울리는 기능
        System.out.println("siren!!");
    }
}
 
cs




: 인스턴스 타입과 참조변수 타입이 일치하는 것이 보통이지만 클래스가 서로 상속관계에 있을 경우 조상클래스 타입의 참조변수로 자손 클래스의 인스턴스를 참조하도록 하는 것도 가능하다


FireEngine e = new FireEngine();

car c = new FireEngine();       // 조상 타입의 참조변수로 자손 인스턴스를 참조

=> 자손의 인스턴스를 참조하므로 c.drive()의 결과는 drive, fire이 된다.

=> 둘 다 같은 타입의 인스턴스지만 참조변수의 타입에 따라 사용할 수 있는 멤버의 개수가 달라짐





반응형

'프로그래밍 > JAVA' 카테고리의 다른 글

[JAVA] 7 객체지향 프로그래밍 2-3  (0) 2017.07.22
[JAVA] 7 객체지향 프로그래밍 2-1  (0) 2017.07.11
[JAVA] 6 객체지향 프로그래밍1  (0) 2017.07.05
[JAVA] 배열 예제  (0) 2017.07.04
[JAVA] 5 배열 (Array)  (0) 2017.07.03

+ Recent posts