본문 바로가기

자바

Day07

package : 클래스의 묶음으로, 패키지에는 클래스 또는 인터페이스를 포함시킬 수 있으며, 서로 관련된 클래스들끼리 그룹 단위로 묶어 놓음으로써 클래스를 효율적으로 관리할 수 있다.

같은 이름의 클래스일지라도 서로 다른 패키지에 존재하는 것이 가능하므로, 다른 개발자가 개발한 클래스 라이브러리의 클래스와 이름이 충돌하는 것을 피할 수 있다.

클래스가 물리적으로 하나의 클래스파일(.class)인 것과 같이 패키지는 물리적으로 하나의 디렉토리이다.

 

import문 : 소스코드를 작성할 때 다른 패키지의 클래스를 사용하려면 패키지명이 포함된 클래스 이름을 사용해야 한다. 하지만 매번 패키지명을 붙여서 작성하는것이 불편하기 때문에 import문으로 사용하고자 하는 클래스의 패키지를 미리 명시해주면 소스코드에 사용되는 클래스이름에서 패키지명은 생략할 수 있다.

**이클립스에서 단축키 'ctrl + shift + o'를 누르면. 자동으로 import문을 추가해준다.

import문 선언에서 클래스이름을 지정해주는 대신 '*'을 사용하면, 한 패키지에서 여러 클래스를 사용하는 경우 클래스의 이름을 일일이 지정해주는 것보다 편리하다. 하지만, import하는 패키지의 수가 많을 때는 어느 클래스가 어느 패키지에 속하는지 구별하기 어렵다는 단점이 있다. 그리고 import문에서 클래스의 이름대신 '*'을 사용하는 것이 하위 패키지의 클래스까지 포함하는 것은 아니다.

 

super() : 조상 클래스의 생성자 -> this()는 같은 클래스의 다른 생성자를 호출하는데 사용되지만, super()는 조상 클래스의 생성자를 호출하는데 사용된다. 생성자의 첫 줄에서 조상클래스의 생성자를 호출해야하는 이유는 자손 클래스의 멤버가 조상 클래스의 멤버를 사용할 수도 있으므로 조상의 멤버들이 먼저 초기화되어 있어야 하기 때문이다.

Object 클래스를 제외한 모든 클래스의 생성자 첫 줄에 생성자this() 또는 super()를 호출해야 한다. 그렇지 않으면 컴파일러가 자동적으로 'super();'를 생성자의 첫줄에 삽입한다. 

인스턴스를 생성할 때는 클래스를 선택하는 것만큼 생성자를 선택하는 것도 중요하다.

1.클래스 - 어떤 클래스의 인스턴스를 생성할 것인가?

2.생성자 - 선택한 클래스의 어떤 생성자를 이용해서 인스턴스를 생성할 것인가?

 

제어자(modifier) : 접근 제어자는 한번에 네 가지 중 하나만 선택해서 사용할 수 있다.(public,private,protected,default) - 아무것도 적지않는다면 기본적으로 default 접근 제어자를 사용한다.  

final - 마지막의, 변경될 수 없는 : 변수에 사용되면 값을 변경할 수 없는 상수가 되며, 메서드에 사용되면 오버라이딩을 할 수 없게 되고 클래스에 사용되면 자신을 확장하는 자손클래스를 정의하지 못하게 된다.

final이 붙은 변수는 상수이므로 일반적으로 선언과 초기화를 동시에 하지만, 인스턴스 변수의 경우 생성자에서 초기화 되도록 할 수 있다.

클래스내에 매개변수를 갖는 생성자를 선언하여, 인스턴스를 생성할 때 fianl이 붙은 멤버변수를 초기화하는데 필요한 값을 생성자의 매개변수로부터 제공받는 것이다.

 

생성자의 접근 제어자 : 생성자에 접근 제어자를 사용함으로써 인스턴스의 생성을 제한할 수 있다. 생성자의 접근 제어자를 private으로 지정하면, 외부에서 생성자에 접근할 수 없어서 인스턴스를 생성하지 못한다. 그래도 클래스 내부에서는 인스턴스를 생성할 수 있다.

final class Singleton {
	private static Singleton s = new singleton(); // getInstance()에서 사용될 수 있도록 인스턴스가 
    											// 미리 생성되어야 하므로 static이어야 한다.
    
    private Singleton() { //...... }
    //인스턴스를 생성하지 않고도 호출할 수 있어야 하므로 static 사용
    public static Singleton getInstance() {
    if(s == null )
    	s = new Singleton();
        return s
    }
 } 
 class SingletonTest {
 	public static void main(string args[]) {
   	// Singleton s = new Singleton();  <- 생성자가 private이기때문에 인스턴스생성불가 , 에러발생
        Singleton s = Singleton.getInstance();
        }
 }       

생성자를 통해 직접 인스턴스를 생성하지 못하게 하고 public 메서드를 통해 인스턴스에 접근하게 함으로써 사용할 수 있는 인스턴스의 개수를 제한할 수 있다. 그리고 생성자가 private인 클래스는 다른 클래스의 조상이 될 수 없다.

왜냐하면 자손클래스의 인스턴스를 생성할 때 조상클래스의 생성자를 호출해야만 하는데, 생성자의 접근 제어자가 private이므로 자손클래스에서 호출하는 것이 불가능하기 때문이다.

객체 array

objectAid : 접근 지정자가 public일 경우 초록색 동그라미 / private일 경우 빨간색 네모 / protected일 경우 노란색 스페이드 / default(package)일 경우 파란색 세모 로 나온다 // 생성자일 경우 메소드 도형에 C가 붙고 // 추상 메소드일 경우엔 A가 붙는다.

objectAid 툴을 이용하여 클래스안에 정의 한 변수와 메서드를 확인하고 클래스간의 관계도 한눈에 보기 쉬워졌다.

<코드를 계속 보고 수정해보고 여러 크고 작은 에러도 겪어보면서 아직은 잘은 모르지만 큰 틀을 볼 수 있는 안목을 키우고 개념을 완전히 이해하기 보다는 여러 오픈 소스 코드들을 찾아보고 직접 코딩해 나가면서 내가 원하는 기능들을 추가할 수 있도록 내 것으로 만들기 위해 더 열심히 해야겠다... 갈길이 정말 멀다.. 퍼지지 말고 끝까지 버티자!!> 

 

 

'자바' 카테고리의 다른 글

Day09  (0) 2021.05.14
Day08  (0) 2021.05.13
Day06  (0) 2021.05.11
Day05  (0) 2021.05.10
1주차 예제를 통한 간단한 복습  (0) 2021.05.09