Coram Deo

ch 7-10~16[객체지향 개념] - super, 패키지, classpath, import문 본문

자바의 정석

ch 7-10~16[객체지향 개념] - super, 패키지, classpath, import문

탁탁슝 2022. 11. 6. 00:02

ch 7-10 참조변수 super

- 객체 자신을 가리키는 참조변수. 인스턴스 메서드(생성자)내에만 존재

- 조상의 멤버를 자신의 멤버와 구별할 때 사용

* this는 lv와 iv 구별할 때 사용

class Ex7_3 {
	public static void main(String args[]) {
    	Child2 c = new Child2();
        c.method();
    }
}

class Parent2 { int x = 10;	// super.x와 this.x 둘 다 가능 }

class Child2 extends Parent2 {
	void method() {
    	system.out println("x=" + x);
        system.out println("this.x=" + this.x);
        system.out println("super.x=" + super.x);
    }
}

// 출력결과 
// x=10
// this.x=10
// super.x=10

ch 7-11 super() - 조상의 생성자

- 조상의 생성자를 호출할 때 사용

- 조상의 멤버는 조상의 생성자를 호출해서 초기화

- 참조변수 super와 전혀 관계없음.

* 자손의 생성자는 자기가 선언한 것만 초기화 해야 함. 조상꺼는 super()를 통해 초기화.

- 모든 생성자는 첫 줄에 반드시 생성자를 호출해야 한다. (중요!)

* 그렇지 않으면 컴파일러가 생성자의 첫 줄에 super(); 를 삽입

* 이 경우에 부모 클래스에 기본 생성자가 없다면 에러남.

 

ch 7-12 패키지(package)

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

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

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

- rt.jar는 클래스들을 압축한 파일(JDK 설치경로 \jre\lib에 위치) 

* rt는 runtime (실행 중임을 의미함.)

* jar파일은 클래스 파일을 묶어놓은 것.(압축 파일)

* java9부터 rt.jar파일 없어짐. rt.jar 파일이 너무 커서 작은 module로 쪼개 놓음.

 

ch 7-13 패키지의 선언

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

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

- 패키지 선언이 없으면 이름없는(unnamed) 패키지에 속하게 된다. (default package)

- 소스파일에서 직접 패키지 폴더 보려면

  • 소스파일 우클릭 →  Show  In →  System Explorer  
  • cmd 창에서 소스파일 실행하려면 bin폴더 경로 복사 후, bin 폴더경로로 이동. 
  • 예시) cd C:\java\workspace\ch07\bin
  • 경로 이동 후, 파일 실행. 예시)  java com.codechobo.book.PackageTest
  • 파일 실행할 때 마다 매번 bin 폴더로 이동하기엔 너무 불편함. → 클래스 패스(class path)를 사용하면 문제 해결됨.

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

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

 

ch 7-14 클래스 패스(classpath)

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

- 환경변수 classpath로 관리하며, 경로간의 구분자는 ';'를 사용

- classpath(환경변수)에 패키지의 루트를 등록해줘야 함.

- class path 등록하면, 경로 이동 없이 바로 실행 가능.

 

- 클래스 패스 만드는 법

  • 제어판 → 환경변수 → 시스템 → 환경변수 → 새로 만들기 →
  • 변수이름 : classpath 
  • 변수값 : 실행하고 싶은 파일의 경로(예시 C:\java\workspace\ch07\bin)

 

- cmd에서 클래스 패스 값 확인 및 수정하는 법

  • set classpath
  • classpath 수정하려면, "set classpath=" 뒤에 세미콜론(;)붙인 후, 원하는 경로 추가하면 됨.
  • 예시) set classpath=C:\java\workspace\ch07\bin;\jdk1.8\work\util\jar

- 이클립스 사용하면 이클립스에서 자동으로 해줌. 

 

ch 7-15  import 문

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

- 컴파일러에게 클래스가 속한 패키지를 알려준다.

- 이클립스 자동으로 import문 생성 단축키 :  ctrl + shift + o(알파벳)

- java.lang 패키지의 클래스는 import하지 않고도 사용할 수 있다.

예시) String, Object, System, Thread

원래는 import java.lang.*; 써야하지만, 생략 가능함.

- java.lang.* :  '*' 표시는  java.lang 패키지 안에 있는 모든 클래스를 뜻함.

// import문 사용하지 않았을 경우
class ImportTest {
	java.util.Data today = new java.util.Date();
}



// import문 사용했을 경우, 패키지 이름 생략가능
import java.util.Data;

class ImportTest {
	Data today = new Date();
}

ch 7-15  import 문의 선언

- import문을 선언하는 방법은 다음과 같다.

    import 패키지명.클래스명; // 단축키 : ctrl + shift + o

          또는

    import 패키지명.*; // 패키지 안에 있는 모든 클래스

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

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

// import문 선언 시
// 클래스 하나하나 쓰면 어떤 클래스를 사용하는지 명확히 알 수 있다.
// 그러나 성능에 영향없음으로 편한대로 쓰면 된다.
// 보통 프로그램 개발할 때는 * 많이 쓰고, API나 라이브러리 개발할 때는 클래스 하나하나 명시하는 경우가 많다.

// 클래스이름 명시하는 경우
import java.util.Calendar;
import java.util.Date;
import java.util.ArrayList;

// '*' 사용하는 경우
import java.util.*;

- 다음의 두 코드는 서로 의미가 다르다.

// 1과 2는 다른 의미
// 1. 명시된 패키지의 모든 클래스
import java.util.*;
import java.text.*;

// 2. java패키지의 모든 클래스(패키지는 포함안됨.)
import java.*;

 

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

// 다른 패키지에 있는 클래스 이름이 동일한 경우
import java.sql.*;	// java.sql.Date
import java.util.*;	// java.util.Data

public class ImportTest {
	public static void main(String() args) {
    	java.util.Date today = new java.util.Data(); // 클래스 앞에 패키지명 붙여주기
    }
}

 

ch 7-16  static import 문

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

- static import문을 사용하는 이유 : 클래스 이름을 붙이면 코드가 너무 길어짐. 그래서 생략하려고 씀.

웬만하면 static import문 사용하지 말기.

클래스 이름이 있으면 명확히 알아볼 수 있으니 꼭 필요할 때만 쓰기.

import.static java.lang.Integer.*;		// Integer클래스의 모든 staic 메서드. 
						// * 은 Integer 클래스에 있는 모든 static 멤버를 의미함.(static 변수, static 메서드)
import.static java.lang.Math.random;		// Math.random()만. random뒤에 괄호 안붙임.
import.static java.lang.System.out;		// System.out을 out만으로 참조가능

// 원래 코드
system.out.println(Math.random());

// 생략한 코드
out.println(random());