1. Java 프로그램의 기본 구조
Java 프로그램의 기본 구성 요소와 주요 개념을 알아보겠습니다. Java는 모든 코드가 클래스와 메소드로 이루어져 있으며, main 메소드가 프로그램의 시작점이 됩니다. Java 코드를 작성할 때 가장 중요한 요소를 아래와 같이 정리해 봅니다.
1-1. 클래스와 메소드
Java 프로그램은 하나 이상의 클래스 파일로 구성되며, 각 클래스는 class 키워드로 선언합니다. 클래스 내부에는 메소드가 있으며, Java 프로그램은 반드시 하나의 main 메소드를 가져야 합니다. main 메소드는 public static void main(String[] args) 형태로 작성되며, 프로그램이 시작될 때 가장 먼저 실행되는 메소드입니다.
예를 들어, 아래 코드는 Hello라는 클래스와 그 안에 포함된 main 메소드를 보여줍니다.
public class Hello {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}
1-2. 주석
Java는 주석 기능을 사용하여 코드에 설명을 추가할 수 있습니다. 주석은 코드 실행에 영향을 미치지 않으며, 주석에는 한 줄 주석(//)과 여러 줄 주석(/* ... */)이 있습니다.
1-3. 변수 선언과 출력
Java에서는 변수를 선언할 때 타입과 변수명을 명시합니다. 변수는 프로그램에서 데이터를 저장하는 역할을 하며, System.out.println() 메소드를 사용해 화면에 출력할 수 있습니다.
int number = 10;
System.out.println("Number: " + number); // 출력: Number: 10
2. 식별자와 키워드
Java에서 식별자와 키워드는 프로그램 작성의 기본 요소입니다. 식별자는 클래스, 변수, 메소드에 부여되는 이름이며, 키워드는 Java 언어에서 미리 정의된 특별한 용도의 예약어입니다.
2-1. 식별자
식별자는 클래스, 변수, 메소드 등 프로그램의 다양한 요소에 붙이는 이름입니다. 식별자는 대소문자를 구분하며, 의미를 이해하기 쉽게 작성하는 것이 좋습니다. 다음은 식별자를 작성할 때의 규칙입니다.
- 첫 문자는 문자, _, $로 시작해야 하며, 숫자로 시작할 수 없습니다.
- 공백이나 특수 문자(@, #, ! 등)를 사용할 수 없습니다.
- Java의 키워드는 식별자로 사용할 수 없습니다.
예를 들어, int age, double price, String studentName은 모두 유효한 식별자입니다.
2-2. 좋은 이름짓는 법
public class Car {
private int maxSpeed = 120; // 변수
public static final double PI = 3.14159; // 상수
public void calculateSpeed() { // 메소드
// 코드
}
}
- 클래스 이름: 첫 글자는 대문자로 시작하며, 각 단어의 첫 글자도 대문자로 표기합니다. (ex: CustomerOrder)
- 변수와 메소드 이름: 첫 글자는 소문자로 시작하고, 각 단어의 첫 글자는 대문자로 표기합니다. (ex: totalAmount)
- 상수 이름: 모든 문자를 대문자로 표기하고, 단어 간 구분은 _를 사용합니다. (ex: MAX_SPEED)
2-3. 키워드
Java에는 특정한 기능을 나타내는 키워드들이 있습니다. 예를 들어, public, static, int, if, class 등은 모두 키워드로, 다른 용도로 사용할 수 없습니다. 키워드는 컴파일러가 프로그램의 구조를 이해하는 데 사용되므로, 변수나 클래스 이름으로 사용할 수 없습니다.
3. 데이터 타입과 변수
Java의 데이터 타입은 프로그래밍의 중요한 기본 개념 중 하나로, 저장할 데이터의 종류와 크기를 결정합니다. Java의 데이터 타입은 크게 기본 타입과 참조 타입으로 나눌 수 있으며, 각각 다른 용도와 특징을 가지고 있습니다.
3-1. 기본 타입 (Primitive Types)
Java에는 8가지의 기본 타입이 있습니다. 기본 타입은 값이 고정된 크기로 저장되므로, 메모리를 효율적으로 관리할 수 있게 해줍니다.
- 정수 타입
- byte: 1바이트 크기의 정수 타입이며, -128에서 127까지의 값을 저장할 수 있습니다. 메모리 사용이 제한적인 경우에 유용합니다.
- short: 2바이트 크기의 정수 타입으로, -32,768에서 32,767까지 저장할 수 있습니다.
- int: 4바이트 크기의 정수 타입이며, 가장 널리 사용됩니다. -2^31에서 2^31-1까지의 값을 저장할 수 있습니다.
- long: 8바이트 크기의 정수 타입으로, 매우 큰 범위의 정수를 다룰 때 사용됩니다. 값 뒤에 L을 붙여서 long 타입임을 표시할 수 있습니다.
- 실수 타입
- float: 4바이트 크기의 단정밀도 실수 타입입니다. 값의 끝에 f나 F를 붙여 표시하며, 소수점 이하 정밀도가 필요할 때 사용합니다.
- double: 8바이트 크기의 배정밀도 실수 타입으로, 기본적인 실수 타입으로 가장 자주 사용됩니다. 소수점 이하 15자리 정도의 정밀도를 가집니다.
- 문자 타입
- char: 2바이트 크기의 유니코드 문자를 저장하며, 단일 문자만 저장할 수 있습니다. 문자 리터럴은 작은따옴표(')로 감싸서 나타냅니다.
- 논리 타입
- boolean: 논리적 참 또는 거짓을 저장하는 1비트 크기의 타입입니다. true 또는 false 값을 가지며, 조건문에서 주로 사용됩니다.
3-2. 참조 타입 (Reference Types)
참조 타입은 기본 타입과 달리 객체의 주소를 저장합니다. 참조 타입에는 배열, 클래스, 인터페이스 등이 포함됩니다. Java에서는 문자열도 참조 타입에 속하며, String 클래스를 사용합니다.
- 문자열 (String)
- 문자열은 String 클래스로 표현되며, 기본 타입이 아닌 객체입니다. 문자열 리터럴은 큰따옴표(")로 감싸서 나타내며, 다양한 문자열 조작 메소드를 제공합니다.
- + 연산자를 사용하여 문자열을 결합할 수 있습니다.
String greeting = "Hello";
String message = greeting + ", Java!";
System.out.println(message); // 출력: Hello, Java!
3-3. 리터럴 (Literals)
리터럴은 프로그램에서 직접 값을 표현하는 방법입니다. Java에서는 다양한 리터럴을 통해 값을 명시할 수 있습니다.
- 정수 리터럴: 정수는 기본적으로 int 타입이며, long 타입일 경우 숫자 뒤에 L을 붙입니다.
int decimal = 10; // 10진수 int octal = 012; // 8진수, 10진수로 10 int hex = 0xA; // 16진수, 10진수로 10 int binary = 0b1010; // 2진수, 10진수로 10 long bigNumber = 100000L; - 실수 리터럴: 실수는 기본적으로 double 타입이며, float 타입은 값 뒤에 f 또는 F를 붙입니다.
double pi = 3.14159; float gravity = 9.8f; - 문자 리터럴: 작은따옴표(')로 감싸 표현하며, \u 뒤에 유니코드로 문자를 나타낼 수 있습니다.
char letter = 'A'; char unicodeChar = '\u0041'; // 'A'와 동일 - 논리 리터럴: 논리형(boolean)의 리터럴은 true 또는 false 두 가지뿐입니다.
boolean isRaining = false;
3-4. 변수 선언과 초기화
변수는 데이터를 저장하는 메모리 공간으로, 변수를 선언할 때 데이터 타입과 변수 이름을 지정합니다. 변수는 선언 시 초기값을 설정할 수 있으며, 이후에는 대입 연산자(=)를 통해 값을 변경할 수 있습니다.
int age = 25; // 선언과 초기화
double salary = 55000.0;
boolean isActive = true;
age = 30; // 변수 값 변경
3-5. 타입 변환
Java는 타입 변환을 통해 한 데이터 타입을 다른 데이터 타입으로 변경할 수 있습니다.
- 자동 타입 변환: 작은 타입이 큰 타입으로 자동 변환됩니다. 예를 들어, int는 double로 자동 변환될 수 있습니다.
int num = 10; double result = num; // 자동으로 int -> double 변환 - 강제 타입 변환: 큰 타입을 작은 타입으로 변환할 때 강제 타입 변환이 필요하며, 이는 데이터 손실을 유발할 수 있습니다.
double pi = 3.14159;
int integerPi = (int) pi; // 3으로 변환, 소수점 이하 손실