자바의 가장 작은 단위 : Class
클래스는 상태와 행동으로 이루어져 있습니다.
실행을 목적으로 하는 자바 클래스에는 main() 메소드가 반드시 있어야 실행이 됩니다.
자바 클래스에 main() 메소드가 없다면 "Exception in thread "main" java.lang.NoSuchMethodError: main" 에러가 발생합니다.
public static void main(String[] args) {
System.out.println("Hello Java"); // 출력 결과 : Hello Java
}
public static
: 제어자, modifier라고 하며, 메소드의 특성을 정하는 부분 입니다.void
: 리턴 타입; 메소드가 끝났을 때 반환하는 타입 입니다.main
: 메소드의 이름 입니다.String[] args
: 매개변수 입니다.System.out.println("Hello Java");
: 메소드 내용(method body) 입니다.(String[] args) {
: 소괄호와 중괄호 사이에 예외 목록(exception list)을 선언할 수 있습니다.
위에 쓰여진 public
, static
, void
같은 것들을 예약어라고 하며, 예약어를 클래스의 이름, 변수명 등으로 정할 수 없습니다.
자바 코드의 실행 절차
소스 실행 -> 컴파일러 -> 바이트 코드 -> 디스크 -> JVM -> 기계어 -> 운영체제
- 소스 파일 작성 (.java 파일) : 개발자는 Java 프로그래밍 언어를 사용하여 소스 코드를 작성합니다. 이 소스 파일의 확장자는 .java입니다.
- 컴파일러 (javac.exe) : 작성된 소스 코드는 Java 컴파일러 (javac.exe)를 사용하여 컴파일됩니다. 이 과정에서 .java 파일은 바이트 코드로 변환됩니다. 바이트 코드는 플랫폼 독립적인 중간 코드 형식입니다.
- 바이트 코드 (.class 파일, 바이너리 파일) : 컴파일된 결과는 .class 파일로 저장됩니다. 이 파일은 Java 바이트 코드로 구성되어 있으며, Java Virtual Machine (JVM)에 의해 실행될 수 있습니다.
- 디스크에 저장 : 생성된 .class 파일은 디스크에 저장됩니다.
- JVM에 의한 바이트 코드 로드 : Java 프로그램이 실행되면, JVM은 디스크에서 바이트 코드를 로드합니다.
- JVM의 바이트 코드 실행 : JVM은 로드된 바이트 코드를 실행합니다. 이 과정에서 JVM은 바이트 코드를 해석하거나 Just-In-Time (JIT) 컴파일을 사용하여 기계어로 변환합니다.
- 기계어 실행 : 변환된 기계어는 운영체제에 의해 실행됩니다. 이 단계에서 실제 프로그램의 동작이 이루어집니다.
Java 프로그램 실행 순서 예시:
MyProgram.java
소스 파일 작성- 컴파일 :
javac MyProgram.java
->MyProgram.class
(바이트 코드) - 디스크에 저장 :
MyProgram.class
- 바이트 코드 로드 : JVM이
MyProgram.class
파일을 로드 - 바이트 코드 실행: JVM이 바이트 코드를 기계어로 변환 및 실행
🎯 이러한 과정을 통해 Java 프로그램은 플랫폼 독립적인 특성을 유지하면서 실행될 수 있습니다. JVM 덕분에 동일한 자바 프로그램은 어떤 플랫폼에서도 동일하게 실행할 수 있습니다.
자바의 4가지 변수
public class VariableType {
int 인스턴스_변수; // 인스턴스 변수 선언
static int 클래스_변수; // 클래스 변수 선언
public void method(int 매개변수) {
int 지역변수 = 10; // 지역 변수 선언 및 초기화
}
}
1. 지역 변수 (Local Variable)
- 정의: 메서드 내에서 선언되는 변수.
- 생명주기: 변수가 선언된 중괄호 {} 내에서만 유효합니다.
- 특징:
- 메서드가 실행될 때 생성되고, 메서드가 종료되면 소멸됩니다.
- 반드시 초기화한 후에 사용할 수 있습니다.
2. 매개 변수 (Parameter)
- 정의: 메서드나 생성자의 호출 시 전달되는 값을 받는 변수.
- 생명주기: 메서드가 호출될 때 생성되고, 메서드가 종료되면 소멸됩니다.
- 특징: 메서드나 생성자의 입력값을 처리하기 위해 사용됩니다.
3. 인스턴스 변수 (Instance Variable)
- 정의: 클래스의 인스턴스가 생성될 때마다 생성되는 변수.
- 생명주기: 객체가 생성될 때 시작하고, 객체를 참조하는 다른 객체가 없어지면 소멸됩니다.
- 특징:
- 객체의 상태를 나타내는 변수.
- 객체마다 별도의 메모리 공간을 가집니다.
4. 클래스 변수 (Class Variable)
- 정의: 클래스에 하나만 존재하는 변수. static 키워드를 사용하여 선언됩니다.
- 생명주기: 클래스가 처음 로드될 때 시작하고, 자바 프로그램이 종료될 때 소멸됩니다.
- 특징:
- 클래스에 한 번만 로드되며, 모든 객체가 공유합니다.
- 클래스 이름을 통해 접근할 수 있습니다.
자바의 두 가지 자료형
1. 기본 자료형 (Primitive Types)
만약 자바에 타입의 범위가 제한이 없다면 파이(π)같은 수식은 3.141592··· 사용하면 엄청 길게 저장되고, 메모리 낭비될 것입니다.
이러한 문제를 해결하기 위해 각 데이터 타입 별로 크기가 정해지게 되었고, 자바도 기본 자료형이 있습니다.
기본 자료형은 자바에서 가장 기본적인 데이터 타입을 의미합니다.
기본 자료형은 값 자체를 저장하며, 총 8가지가 있습니다.
1) 정수형 (Integral Types):
- byte: 8비트 정수, -128(-2^7) ~ 127 (2^7 - 1)
- short: 16비트 정수, -32,768(-2^15) ~ 32,767 (2^15 - 1)
- int: 32비트 정수, -2^31(-2^31) ~ 2^31-1 (2^31 - 1)
- long: 64비트 정수, -2^63(-2^63) ~ 2^63-1 (2^63 - 1)
2) 부동 소수점형 (Floating-Point Types):
- float: 32비트 부동 소수점, 단정도 정밀도
- double: 64비트 부동 소수점, 배정도 정밀도
3) 문자형 (Character Type):
- char: 16비트 유니코드 문자, 0 ~ 65,535
4) 논리형 (Boolean Type):
- boolean: 참 또는 거짓을 나타내는 논리형, 값은 true 또는 false
참고로 정수형 자료형의 지수는 2^n - 1의 형태로 표현됩니다. 즉, 각 지수는 7, 15, 31, 63 인데 7(= 8 - 1), 15(= 16 - 1), 31(= 32 - 1), 63(= 63 -1)로 나타낼 수 있습니다. n은 3부터 증가하며, 각 타입이 나타낼 수 있는 숫자의 범위는 2배씩 증가합니다.
이와 같이 정수형 자료형의 지수와 범위를 수식으로 이해하면, 각 타입이 나타낼 수 있는 숫자의 범위가 2배씩 증가한다는 것을 쉽게 기억할 수 있습니다.
2. 참조 자료형 (Reference Types)
참조 자료형은 객체의 참조(주소)를 저장하는 자료형입니다. 자바의 참조 자료형에는 클래스, 배열, 인터페이스 등이 포함됩니다. 참조 자료형은 기본 자료형과 달리 객체를 가리키는 주소를 저장합니다. 그리고 기본 자료형과는 달리 new
예약어를 이용해서 초기화를 합니다.
(String은 예외가 있는데 여기에서 확인 하실 수 있습니다.)
1) 클래스 (Class): 사용자 정의 데이터 타입으로 속성과 메서드를 가질 수 있습니다.
- 예:
String
,Integer
,CustomClass
2) 배열 (Array): 동일한 타입의 여러 값을 저장할 수 있는 자료형입니다.
- 예:
int[]
,String[]
3) 인터페이스 (Interface): 클래스가 구현해야 하는 메서드의 집합을 정의합니다.
- 예:
Runnable
,Comparable
참조 자료형은 public String toString()
이라는 메소드를 만들어주지 않으면 "타입이름@고유번호"로 출력됩니다.
기본 toString() 메서드는 Object 클래스에서 다음과 같이 정의되어 있습니다:
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
따라서, toString() 메서드를 오버라이드하지 않은 경우, 출력되는 "타입이름@고유번호"에서 고유번호는 hashCode() 메서드의 반환값을 16진수로 변환한 값입니다.
- 📖 참고 :
- 자바의 신 Vol 1: 기초 문법편3rd Edition
- https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html