① 자바프로젝트 생성 -> 프로젝트 폴더 생성
( mac 단축키 : option
+ command
+ N
)
② 패키지 생성 -> 하위 폴더 생성
③ 자바 소스 파일 생성 -> 소스파일 생성(.java)
④ 컴파일 및 바이트 코드 생성 -> 바이트 코드 생성(.class)
⑤ 실행
Do it! 실습 | 생성 프로젝트의 기본구조
package sec01_basicsyntax.EX01_JavaBasicStructure;
/* Control + Command + '/'
처음 만든 클래스!
(여러 줄 주석!)
*/
public class JavaBasicStructure {
public static void main(String[] args) {
// 1줄 주석: 화면 출력 코드 Command + '/'
System.out.println("콘솔 화면에 출력합니다.");
}
}
패키지를 지정하면 주석을 제외한 첫 줄에 반드시 패키지의 선언을 해야한다.
위 실습 코드처럼 첫 줄에 package 패키지이름
이 정의돼 있다면, 소스 파일이 패키지이름
속에 위치하고 있음을 뜻한다.
만약 패키지를 지정하지 않았을 때, 디폴트 패키지
를 사용할때는 패키지 선언이 생략된다.
public class Test {
↓ ↘︎
클래스 임을 클래스 명
알려주는
자바 키워드
}
public
은 이번 코드에서 사용한 클래스를 다른 패키지에서도 사용할 수 있다는 의미를 지닌 접근 지정자이다.
1개의 소스 파일에는 여러개의 클래스가 존재할 수 있는데, 몇 개의 클래스가 존재하든 최대 1개의 클래스만 public
을 포함할 수 있다는 것이 중요하다.
메서드의 구조는 리턴 타입
메서드 이름(...)
{ } 이다.
아래 소스 코드를 보며 메서드의 구조를 익히자.
public static void main(String[] ar){
↓ ↘︎
리턴 타입 메소드 명
}
메서드 구조 앞에 위치한 public
은 접근 지정자, static
은 정적 메서드를 나타내는 자바 키워드이다.
여기서 public static
을 쓴 커피
처럼 메서드를 꾸며 주는 수식어 정도로 이해하면 적절하다.
즉, public static
한 메서드 라고 생각하자!
바이트 코드인 .class
파일이 메서드 영역에 로딩되면 자바 가상 머신(JVM)은 main() 메서드
부터 찾아서 실행 이후 가장 먼저 실행시킨다!
1개의 소스 파일에는 여러 개의 클래스 파일이 포함될 수 있고, 소스 파일명은 반드시 클래스 이름과 같아야 한다고 했다.
Q1. 하나의 자바 소스 파일에 클래스가 여러 개면 어떤 클래스와 이름을 일치시켜야 할까?
정답은 public
이 붙은 클래스이다!
이것이 바로 소스 파일에 1개의 public
클래스만 존재해야 하는 이유이다.
Q2. 소스 파일을 컴파일하면 바이트 코드(.class)는 몇 개 생길까?
소스 파일(.java)당 1개 일까?
아님 정의된 클래스(class)당 바이트 코드(.class)가 1개 일까?
힌트는 바이트 코드(.class)
의 확장명에서 얻을 수 있다.
자바의 바이트 코드(.class)
는 클래스당 하나씩 생성된다.
만약 하나의 소스 파일에 100개의 클래스가 정의되어 있다면, 바이트 코드(.class)도 100개가 생기는 것이다!
Do it! 실습 | 컴파일 후 생성되는 바이트 코드(.class)
package sec01_basicsyntax.EX02_ByteCodeFiles;
class A { // A.class
}
class B{ // B.class
}
class C{ // C.class
class D{ //C$D.class
}
}
public class ByteCodeFiles { // ByteCodeFiles.class
public static void main(String[] args) {
}
}
먼저 1개의 파일에 4개의 클래스가 정의돼 있다. 쉽게 말해 class
라는 키워드가 4개 있다는 것이다.
public
은 class
ByteCodeFiles 앞에 선언돼 있으므로 소스 파일명은 ByteCodeFiles 라고 추측할 수 있다.
그렇다면, 생성되는 바이트 코드명은 어떻게 될까?
외부에 있는 클래스는 클래스 명.class
와 같이 생성된다.
A.class
B.class
C.class
반면, 클래스 내부에 있는 클래스는 반드시 자신을 감싸고 있는 바깥 클래스 부터 먼저 표현해야 한다.
위 코드에서 class C{} 안에 있는 class D{} 는 단독으로 D.class 라는 바이트 코드명은 안되고, C$D.class
라는 바이트 코드명이 생성된다.