클래스가 모이면 패키지.
패키지가 모였을 때 main이 있으면 프로그램, 없으면 라이브러리.
1. 완전한 이름으로 참조한다
지금까지는 클래스 이름만 가지고 클래스를 참조하였다. 만약 같은 패키지 안에 있는 클래스라면 이름만 가지고 참조할 수 있다.
그러나 외부 패키지에 있는 클래스를 사용하려면 앞에 패키지를 붙인 정식 클래스 이름을 써주어야 한다. 예를 들어 graphics 패키지에 있는 Rectangle 클래스의 정식 이름은 graphics.Rectangle이다. 따라서 객체를 생성할 때도 원칙적으로 다음과 같이 작성하여야 한다.
graphics.Rectangle myRect = new graphics.Rectangle();
그러나 반복적으로 많이 사용되는 경우에는 읽기도 힘들고 입력하기도 불편하다. 따라서 이런 경우에는 import를 사용하여 해당 클래스나 패키지를 포함한다.
2. 원하는 패키지 멤버만을 포함한다.
외부 패키지의 특정한 멤버를 import하려면 다음과 같은 문장을 사용한다.
import grphics.Rectangle;
위 코드를 쓴 이후부터는 클래스 이름만 사용하여서 참조가 가능하다.
Rectangle myRect = new Rectangle();
하지만 외부 패키지에서 많은 클래스를 포함한다면 3번을 사용하여 전체 패키지를 포함하는 게 낫다.
하나의 패키지 안에 포함된 모든 클래스를 포함하려면 다음과 같이 별표 문자(*)를 사용하면 된다.
import graphics.*;
=> graphics 패키지의 모든 클래스를 포함.
이후로는 패키지 이름을 생략하고 클래스 이름만으로 참조할 수 있다.
계층적으로 구성된 패키지의 경우, 주의해야할 사항이 있다. 예를 들어 java.awt.*를 포함시키면 java.awt 아래에 있는 패키지, 즉 java.awt.font와 같은 패키지가 자동으로 포함될 거라고 생각하기 쉽다. 그러나 자동으로 포함되지 않는다. 다음과 같이 별도로 포함하여야 한다.
import java.awt.*; // awt 패키지의 클래스 포함
import java.awt.font.*; // awt.font 패키지의 클래스 포함
정적 상수와 정적 메소드를 사용하려면 클래스 이름을 앞에 붙여야한다.
Ex
double r = Math.cos(Math.PI * theta);
=> cos()가 정적 메소드라서 Math를 붙여줘야함
하지만 정적 import 문장을 사용하면 클래스 이름을 생략해도 된다.
Ex
import static java.lang.Math.*;
double r = cos(PI * theta);
CLASSPATH
외부에서 다운로드 받은 클래스를 찾기 위해 가상머신이 살펴보는 디렉토리들을 모아둔 경로가 classpath이다. 즉 라이브러리의 위치를 걸어둔 것.
JAR 압축파일
우리가 애플리케이션을 완성한 후에 사용자에게 무엇을 건네줄 것인지를 생각해보자. 자바에서는 일반적으로 여러 개의 클래스 파일이 있어야 하나의 프로그램이 실행된다. 이 여러 개의 클래스 파일을 그냥 전달해도 되지만, 한 개의 파일로 만들어서 사용자에게 전달할 방법은 없을까?
=> 이 방법이 바로 JAR 파일이다. JAVA archive의 줄임말.
객체가 동일한 값을 가지고 있는지 비교할 때 쓰는 메소드. 근데 연산자 ==이랑은 뭐가 다를까?
예를 들어보자.
String name = "안녕"; -> 콜바이레퍼런스
int num = 10; -> 콜바이밸류
int num = 20;
이렇게 있을 때 컴파일러 입장에서 int 공간은 이미 사이즈를 아니까 미리 할당할 수가 없다.
근데 대문자로 시작하는 모든 애들은 원래는 클래스라서 사이즈를 알 수가 없다(=가변적). 그러니까 값을 넣지 않고 주소를 넣어놓음. 그래서 주소를 받고, 주소에 가서, 값을 호출한다.
그래서 Call-by-Value보다 Call-by-Reference가 훨씬 느림.
==
두 값의 주소만 비교.
예를 들면 if(name == "안녕")하면 false 뜸.
String은 원래는 클래스기 때문에 name의 주소값만 저장함. 그래서 String name의 주소값과 주소값에 저장된 데이터("안녕")은 다른 거니까 false가 뜸.
equals
얘는 1차적으로 주소를 비교함. 주소를 비교했는데 false가 돌아오면 "어 얘가 포인터인가?" 하고 주소로 가서 값을 비교해보고, 값이 동일하면 true를 반환.