본문 바로가기
Programming Language/Java

[자바의 정석] ch7-12 ~ ch7-20 객체지향 개념 정리 (패키지, import문, 제어자, abstract )

by Baest 2021. 7. 22.

ch7-12 패키지(package)

- 서로 관련된 클래스의 묶음

- 클래스는 클래스 파일(*.class), 패키지는 폴더. 하위 패키지는 하위 폴더

- 클래스의 실제 이름(full name)은 패키지를 포함.(java.lang.String)

   rt.jar는 클래스들을 압축한 파일(JDK설치경로\jre\lib에 위치) -> Java9 부터는 없고 module 개념으로 변경

     -jar는 zip 과 같음

 

 

ch7-13 패키지의 선언

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

- 같은 소스 파일의 클래스들은 모두 같은 패키지에 속하게 됨

- 패키지 선언이 없으면 이름없는(unnamed) 패키지에 속하게 됨 (eclipse 에서는 default package)

 

*bin 폴더 - 컴파일된 클래스 파일(*.class)이 있는 곳

*src 폴더 - 소스 파일이(*.java) 있는 곳

 

 

ch7-14 클래스 패스(classpath)

- 클래스 파일(*.class)의 위치를 알려주는 경로(path)

- 환경변수 classpath로 관리하며, 경로간의 구분자는 ';'를 사용. classpath(환경변수)에 패키지의 루트를 등록해줘야함.

 

 

제어판 - 환경변수- 시스템 변수의 새로만들기를 통해 클래스 패스 등록 가능.

새로만들기 클릭 후 변수이름과 변수값(패키지의 루트이며, workspace를 어디로 지정했는지에 따라 경로 다를 수 있음) 넣어주면 추가됨(나는 등록하지 않음! 이클립스가 해주기 때문에...)

 

-> 등록하면 명령창에서 패키지 루트 이동 없이 클래스 실행가능(환경변수창 바뀌면 command 창 새로 열어야함!)

정리하자면, 매번 특정 패키지가 있는 폴더로 이동 없이 classpath로 실행할 수 있게되어 간편함.

 

 

ch7-15 import문

- 클래스를 사용할 때 패키지 이름을 생략할 수 있음

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class ImportTest {
    
    java.util.Date Today = new java.util.Date();
 
}
 
//-> 아래와 같이 import문과 함께 Date 부분 앞에 패키지 이름 없이 사용 가능
 
import java.util.Date;
 
class ImportTest {
 
    Date today = new Date();
 
}
 
cs

- java.lang 패키지의 클래스는 import 하지 않고도 사용할 수 있음(String, Object, System, Thread)

  import java.lang. *;  라고하면 모든 클래스 import 되어 편리하게 쓸 수 있음

* import문 선언은 아래와 같이 함

     import 패키지명.클래스명;

                또는

     import 패키지명.*;             (*는 모든 클래스 의미)

 

- import문은 패키지문과 클래스 선언의 사이에 선언

- import문은 컴파일 시 처리되므로 프로그램 성능에 영향없음

1
2
3
4
5
6
7
8
9
import java.util.Calendar;
import java.util.Date;
import java.util.ArrayList;
 
//위의 세가지를 아래의 한줄로 처리 가능
 
import java.util.*;
 
 
cs

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

 

*자동 import 이클립스 단축키: ctrl + shift + o

(똑같은 이름의 클래스가 여러가지 있으면, 선택 할 수 있도록 옵션 주어짐)

 

 

ch7-16 static import문

- static멤버를 사용할 때 클래스 이름을 생략할 수 있게 해줌

- static import문은 클래스 이름이 있으면 코드가 너무 길어져서 나중에 추가된 것이라고 함

 

 

ch7-17 제어자(modifier)

- 클래스와 클래스의 멤버(멤버 변수, 메서드)에 부가적인 의미 부여

*접근제어자 public, protected, (default), private

그 외 static, final, abstract, native, transient, synchronized, volatile, strictfp

- 하나의 대상에 여러 제어자를 같이 사용 가능(접근 제어자는 하나만)

 

1
2
3
4
5
6
7
8
9
10
public class ModifierTest {
    public static final int WIDTH = 200;
 
    public static void main(String[] args) {
        System.out.println("WIDTH="+WIDTH);
    }
 
}
 
 
 
cs

 

 

ch7-18 static - 클래스의, 공통적인

제어자 대상 의미
static 멤버변수 - 모든 인스턴스에 공통적으로 사용되는 클래스 변수가 된다.
- 클래스 변수는 인스턴스를 생성하지 않고도 사용 가능하다.
- 클래스가 메모리에 로드될 때 생성된다.
메서드 - 인스턴스를 생성하지 않고도 호출이 가능한 static 메서드가 된다.
- static 메서드 내에서는 인스턴스멤버들을 직접 사용할 수 없다.

 

 

ch7-19 final - 마지막의, 변경될 수 없는

제어자 대상 의미
final 클래스 변경될 수 없는 클래스, 확장될 수 없는 클래스가 된다. 
그래서 final로 지정된 클래스는 다른 클래스의 조상이 될 수 없다.
ex) String 클래스, Math 클래스(static 메서드 집합)
메서드 변경될 수 없는 메서드, final로 지정된 메서드는 오버라이딩을 통해 재정의 될 수 없다.
멤버변수 변수 앞에 final 이 붙으면, 값을 변경할 수 없는 상수가 된다.
지역변수

 

1
2
3
4
5
6
7
8
9
final class FinalTest { //조상이 될 수 없는 클래스
    final int MAX_SIZE = 10//값을 변경할 수 없는 멤버변수(상수)
 
    final void getMaxSize() { //오버라이딩 할 수 없는 메서드(변경불가)
        final int LV = MAXSIZE; //값을 변경할 수 없는 지역변수(상수)
        return MAX_SIZE;
    }
 
}
 
cs

 

 

ch7-20 abstract - 추상의, 미완성의

제어자 대상 의미
abstract 클래스 클래스 내에 추상 메서드가 선언되어 있음을 의미한다.
메서드 선언부만 작성하고 구현부는 작성하지 않은 추상 메서드임을 알린다.

 

1
2
3
4
5
abstract class AbstractTest { //추상 클래스(추상 메서드를 포함한 클래스)
 
    abstract void move();    //추상 메서드(구현부가 없는 메서드)
 
}
 
cs

-> AbstractTest a = new AbstractTest(); //에러. 추상클래스(미완성 설계도)의 인스턴스 생성불가(제품생산불가)

*추상클래스를 상속받아서 완전한 클래스 만든 이후 객체 생성 가능

 

 

 

 

============================================================================

https://youtu.be/hcHJgmX8VlA