반응형

           

  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
반응형

           

  JAVA Study





- 제어문

: 프로그램의 흐름을 바꾸는 역할을 함

: 조건문과 반복문이 있음

: 조건문 ( if , switch) - 조건에 따라 문장이 수행됨

: 반복문 ( for, while, do-while ) - 특정 문장을 반복 수행


- if문

: if(조건식){ } 형태 - 조건식이 참일 경우 { }안의 내용을 수행

: 조건식의 결과는 반드시 true / false 여야함


- if-else문

: if문의 변형으로 'else블럭' 추가

: else블럭은 그밖의 다른 조건을 의미하며, if의 조건문이 거짓일 때 else블럭을 수행하라는 의미


- if-else if문

: 처리해야 할 경우의 수가 셋 이상인 경우 사용


if (조건식1){

// 조건식 1이 참일경우 실행

} else if(조건식 2){

//조건식 2가 참일경우 실행

} else {

//위의 어느 조건도 만족하지 못할 경우 실행

}


- 중첩 if문

: if문 블럭 내에 또 다른 if문을 포함시킴, 중첩 횟수에는 제한이 없음


if (조건식 1) {

// 조건식 1이 참일 경우 실행

if (조건식 2){

//조건식 1과 조건식 2가 모두 참일경우 실행

} else{

//조건식 1은 참, 조건식 2는 거짓일 경우 실행

}

} else{

//조건식 1이 거짓일 경우 실행

}


- switch문

: 단 하나의 조건식으로 많은 경우의 수를 처리할 수 있음

: 조건식을 먼저 계산 후, 결과가 일치하는 case문으로 이동하여 실행 -> break;를 만나면 전체 switch문을 빠져나감


switch (조건식) {

case 값1: // 조건식 결과와 값1이 같을 때 실행

break; // case 값1이 실행될 경우 switch문을 빠져나감

case 값2: //조건식 결과와 값2가 같을 때 실행

break; //case 값2가 실행될 경우 switch문을 빠져나감

default : 

//조건식과 일치하는 case없을 경우 실행

//마지막에 작성되므로 break 없어도 됨

}


: switch문의 조건식의 결과값은 반드시 정수 또는 문자열이어야 함 -> case 값도 정수 또는 문자열이어야 함

: case값이 중복될 수 없음


- switch문 중첩

: 중첩가능, break;에 유의해 작성할 것


switch (조건식) {

case 값1: // 조건식 결과와 값1이 같을 때 실행

switch (조건식) {

case 값3 : 

break;

case 값4 :

break;

}

break; // case 값1이 실행될 경우 switch문을 빠져나감


case 값2: //조건식 결과와 값2가 같을 때 실행

break; //case 값2가 실행될 경우 switch문을 빠져나감


default : 

//조건식과 일치하는 case없을 경우 실행

//마지막에 작성되므로 break 없어도 됨

}


- for 문

: 반복 횟수를 알고 있을 때 적합


for (초기화 ; 조건식 ; 증감식) {   

// 조건이 참일 때 실행

}


: 조건식의 세가지 모두 생략 가능하며, 이 경우에는 조건식이 참으로 간주되어 무한반복되므로 특정조건을 만족하면 if문을 빠져나오게 해야 함 ( ex. for(;;) {----} )


- 중첩 for 문


- 향상된 for문

for ( 타입변수명 : 배열 또는 컬렉션) {

//반복할 문장

}

: 타입은 배열 또는 컬렉션의 타입과 일치

: 배열이나 컬렉션에 저장된 요소들을 읽어오는 용도로만 사용가능


- while문

while (조건식) {

// 조건식의 연산결과가 참인 동안 반복

}

: 조건식을 평가하여 조건식이 거짓이면 문장 전체를 벗어남 / 참일 경우 블럭 내 문장을 수행

: 조건식이 거짓이 될 때까지 반복

: 조건식 생략 불가


- do-while문

: 블럭 {}을 먼저 수행한 후 조건식을 평가

: 최소한 한번은 수행될 것을 보장함


do {

// 조건식 결과가 참일 때 수행

} while (조건식) ;


- break문

: 자신이 포함된 가장 가까운 반복문을 벗어남

: 주로 if문과 함께 사용되어 특정조건 만족 시 반복문을 벗어남


- continue 문

: 반복문 내에서만 사용가능

: continue를 만나면 반복문의 끝으로 이동하여 다음 반복으로 넘어감

: for문의 경우 증감식으로 이동, while/ do-while문의 경우 조건식으로 이동

: 반복문 전체를 벗어나지 앟ㄴ고 다음 반복을 계속 수행함


- 이름 붙은 반복문

: break는 근접한 하나의 반복문만 벗어날 수 있으므로, 중첩반복문 앞에 이름을 붙이고 break문과 continue문에 이름을 지정해 줌으로써 하나 이상의 반복문을 벗어나거나 건너뛸 수 있음


Look : for ( int i=0; i<9; i++ ) {

 for ( int j=0; j<9; j++ ) {

if (j==5){

break Look;

}

}



 자바의 정석 저자 강의


- 조건문과 반복문



반응형

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

[JAVA] 제어구조 예제 2  (0) 2017.06.28
[JAVA] 제어구조 예제 1  (0) 2017.06.27
[JAVA] 연산자 예제  (0) 2017.06.25
[JAVA] 3. 연산자 (Operator)  (0) 2017.06.24
[JAVA] 2. 변수 (Variable)  (0) 2017.06.22

+ Recent posts