자바 개발 환경 설정
프로그래밍 언어로 프로그램을 작성하려면 도구가 필요합니다. 자바에서는 JDK(Java Development Kit)를 설치해야 합니다. 또한, 자바로 프로그램을 작성하는 것을 돕는 IDE(Integrated Development Environment)라는 도구가 있습니다. 여러 IDE가 존재하지만 저는 인텔리제이를 사용할 예정입니다.

자바 바이트 코드로 변환된 Main.class 파일을 JVM이 읽어들여 프로그램을 실행합니다. JVM은 자바 프로그램의 실행을 담당하는 프로그램입니다. 자바 컴파일러와 같은 폴더에 있는 java.exe가 JVM을 구동하는 역할을 합니다. 프로그램이 실행되는 이 과정을 런타임(runtime)이라고 합니다.
자바 소스 코드의 구조
public class Main {
public static void main(String[] args) {
System.out.printf("Hello and welcome!");
for (int i = 1; i <= 5; i++) {
System.out.println("i = " + i);
}
}
}
- 클래스(class) : 프로그램을 구성하는 기본 단위로, 자바 프로그램은 1개 이상의 클래스로 구성됩니다.
- 첫 줄에 있는 Main이 클래스명
- 첫 글자는 알파벳 대문자
- public이 붙은 클래스는 한 파일에 1개만 존재
- 클래스로 선언할 때는 class 키워드가 반드시 필요
- main() : 프로그램의 시작점을 의미합니다. 또한, 클래스 전체에서 main() 메서드는 하나만 존재할 수 있습니다.
- 명령의 종료를 나타내는 세미콜론(;)을 항상 붙입니다.
System 클래스
자바 프로그램은 일반 프로그램과 달리 JVM 위에서 실행됩니다. 즉, 프로그램에서 직접 운영체제에 접근할 수 없습니다.

출력 명령어
출력하기 위해서는 print() 명령어를 사용합니다. 그러나 줄을 바꾸고자 할 경우는 개행 문자 또는 줄 바꿈 문자인 \n을 넣어서 실행합니다.
특수문자 | 의미 |
\b | 커서를 한 문자 앞으로(백스페이스) |
\n | 줄 바꿈 |
\r | 줄의 맨 앞으로(캐리지 리턴) |
\t | 탭, 들여쓰기 |
\0 | 빈칸(null) |
println()을 이용하면 출력하고 자동으로 줄을 바꿔주기 때문에 따로 개행 문자를 사용하지 않아도 됩니다.
입력 명령어
대표적인 입력 명령어로는 read()가 있습니다. 키보드로 값을 받으라는 의미로 아래와 같이 입력합니다.
System.in.read();
만일 main() 메서드에 아래와 같이 작성하면 키보드로 입력받은 값을 읽어와서 화면에 출력하라는 의미입니다.
public class Main {
public static void main(String[] args) {
System.out.println(System.in.read());
}
}
그러나 read() 명령어를 사용할 때는 반드시 예외 처리를 해야 합니다. 따라서, 아래와 같이 작성해야 합니다.
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
System.out.println(System.in.read());
}
}
그리고 read() 명령어가 입력값을 아스키(ASCII)코드로 받습니다.
아스키 코드란? 알파벳이나 숫자 등을 컴퓨터가 이해할 수 있게 변환(인코딩)할 때 사용합니다.
read() 명령어가 1바이트(byte)만 읽을 수 있습니다. 숫자나 알파벳은 1글자가 1바이트, 한글은 1글자가 2바이트입니다.
만일 1을 입력하였을 때 그대로 출력하고자 한다면 형변환을 할 수 있습니다.
형변환 : 숫자를 문자로 변환하는 것
Scanner 클래스
자바는 입출력이 스트림을 통해 이루어집니다.
스트림(stream) : 입출력 장치와 프로그램을 연결하는 통로
- 입력 장치로 입력한 값은 입력 스트림을 통해 프로그램으로 전달 => System.in
- 프로그램을 실행한 결과는 출력 스트림을 통해 출력 장치에 표시 => System.out

자바에서 값을 입력받을 때는 주로 Scanner 클래스를 사용합니다.
Scanner 클래스로 값을 입력받아 프로그램에서 사용하려면 이 값을 어딘가에 저장해야 합니다.
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
}
}
그러나 Scanner 클래스가 다른 패키지에 있기 때문에 임포트를 해주어야 합니다. 즉, 아래와 같이 작성해야 합니다.
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
System.out.println(scan.nextLine());
}
}
- nextLine()은 Scanner 클래스에 속한 명령어입니다. 이는 값을 한 줄 단위로 입력받을 수 있습니다. 값을 가져오는 대상은 scan 변수입니다.
- 즉, 변수와 명령어를 점으로 연결한 scan.nextLine()은 한 줄 단위, 즉 Enter 누를 때까지 내용을 입력받습니다.
- 사용자가 값을 입력하면 scan 변수에 저장 -> nextLine()으로 한 줄씩 읽습니다. 이를 println()으로 출력합니다.
입력은 명령을 실행하는 데 필요한 데이터를 넣어주는 것을 의미합니다. 그러나 입력한 데이터를 프로그램에서 사용하려면 컴퓨터 어딘가에서 기억하고 있어야 합니다. 이를 저장이라 하며 컴퓨터의 메모리에서 담당합니다.
변수 선언
메모리에 데이터를 저장하려면 변수가 필요합니다.
변수 : 프로그램이 데이터를 저장하기 위해 할당받은 메모리 공간
변수 선언 : 변수를 만드는 것
자료형 변수명;
- 변수 선언 : 프로그램에서 만든 변수에 어떤 데이터를 저장할 수 있는지를 자바 컴파일러에 알려주는 역할만 수행
- 자료형 : 변수에 저장하는 데이터의 형태
변수명을 지을 때 규칙
- 대소문자를 구분하고 길이 제한이 없다.
- 숫자로 시작하지 않는다.
- 특수 문자는 _ 와 $ 만 허용한다.
- 공백이 없어야 한다.
- 키워드를 사용하면 안된다.
변수 초기화
- 초기화 : 변수를 선언한 후 값을 넣어 저장하는 것
- 값을 출력하려면 변수가 위치한 메모리에 접근을 해야 합니다. 그러나 초기화하지 않는 경우는 변수만 선언한 것이기 때문에 초기화를 해야 메모리가 할당되며 비로소 변수가 생성됩니다.
- 만일 초기화하지 않는 경우는 오류가 발생합니다. => variable a might not have been initialied
- 초기화는 변수 선언과 동시에 해도 되고 나중에 따로 해도 됩니다. 그러나 반드시 초기화는 해야 합니다.
- 자료형이 같으면 여러 변수를 한 번에 선언하고 초기화할 수 있습니다. 이때 쉼표로 구분합니다.
int number1, number2, number3;
int a = 0, b = 0, c = 0;
변수명 표기법
- 카멜 표기법 (camel case)
- 가장 유명한 표기법으로, 모양이 낙타의 등을 닮아서 지어진 이름입니다. 첫 글자는 소문자로 시작하고 여러 단어로 구성되면 첫 단어를 제외하고 각 단어의 첫 글자를 대문자로 표기합니다. 자바에서 변수명을 지을 때 사용합니다.
int firstNumber;
- 파스칼 표기법 (pascal case)
- 모든 단어의 첫 글자를 대문자로 표기합니다. 자바에서 클래스명을 지을 때 사용합니다.
int FirstNumber;
- 스네이크 표기법 (snake case)
- 모든 단어를 소문자로 표기하고 여러 단어일 때 뱀처럼 생긴 언더바(_)로 단어를 연결합니다. 그래서 언더바 표기법이라고도 합니다.
int first_number
- 헝가리안 표기법 (Hungarian notation)
- 자료형을 파악하기 쉽게 접두어(첫 번째 단어)를 붙이는 표기법입니다.
int intNumber;
String strName;
String txtMyName;
기본 자료형
자료형 : 변수에 저장하는 값의 형태
자료형 변수명 = 값;
정수형 변수
- 기본으로 int 키워드를 사용
- 정수형 변수는 값의 크기에 따라 byte(1바이트), short(2바이트), int(4바이트), long(8바이트)을 사용
- long일 때만 값 뒤에 L 또는 l을 붙여 구분합니다.
int intNum = 123;
long longNum = 45678910L;
실수형 변수
- 소수점이 있는 형태의 수
- 기본으로 double 키워드를 사용
- 실수를 저장할 때는 float(4바이트)나 double(8바이트)을 사용
- float일 때는 값 뒤에 F 또는 f를 붙여 구분합니다.
float floatNum = 123.4F;
double doubleNum = 123.4;
문자형 변수
- 문자를 저장할 때는 char(2바이트)를 사용
- 문자임을 알 수 있게 작은따옴표(') 사이에 넣습니다.
char charTxt = 'a';
char charNum = '1';
논리 자료형
- 값으로 참(true), 거짓(false)만 가지며, boolean(1바이트)을 사용해 표시합니다.
boolean isTrue = true;

공간보다 더 큰 값을 저장하면 일부 데이터가 저장되고 나머지 데이터는 저장할 공간이 없어서 손실됩니다. 데이터 손실이 일어나면 프로그램은 오류가 발생합니다.

공간보다 작은 값을 저장하면 공간은 넉넉하기 때문에 문제없이 저장되고 오류도 발생하지 않습니다. 그러나 공간이 낭비될 수 밖에 없습니다.

즉, 프로그램 오류가 발생하거나 메모리가 낭비되지 않도록 값의 크기에 맞게 자료형을 할당합니다.

참조 자료형
String : 문자열로 된 값을 표시할 때 사용
- 문자열은 자바에서 큰따옴표(")로 표시합니다.
참조 자료형은 값이 저장된 주소를 저장합니다. 이때 주소는 메모리에서 위치를 나타냅니다.
String strTxt = "a";
String strWord = "Java";
String strNum = "123";
String strKor = "코딩 자율학습";
타입 추론
- var로 변수를 선언할 수 있습니다.
- 컴파일러가 값을 보고 자료형을 추론해 선언합니다.
printf()로 서식 지정해서 출력하기
원하는 형식으로 내용을 출력하고자 하면 printf()를 사용합니다.
- printf()는 줄 바꾸기 기능이 없기 때문에 결과가 한 줄로 출력합니다.
- 줄 바꿈을 하기 위해서 \n을 추가합니다.
서식 지정자는 큰 따옴표로 감싸줍니다.
System.out.printf("서식_지정자", 값);
서식 지정자(형식 지정자) : 뒤에 오는 값을 화면에 어떻게 출력할지 형태를 지정하는 역할
서식 지정자 | 출력 형태 | 서식 지정자 | 출력 형태 |
%d | 정수 | %b | 논리형 값 |
%f | 실수 | %t | 시간과 날짜 |
%c | 문자 | %n | 줄 바꿈 |
%s | 문자열 | %% | % 기호 |
public class Main {
public static void main(String[] args) {
System.out.printf("이름 : %s%n", "강지현");
System.out.printf("나이 : %d\n", 26);
System.out.printf("취미 : %s\n", "코딩");
}
}
한 줄로 출력하는 경우 printf()에 서식 지정자를 여러 개 넣으면 뒤에 오는 값이 순서대로 서식 지정자 위치로 들어가 출력됩니다. 서식 지정자의 개수와 값의 개수는 동일해야 합니다.
System.out.printf("이름: %s%n나이: %d%n취미: %s", "강지현", 26, "코딩");
플래그 | 설명 |
플래그 없음 | 오른쪽 정렬하고 빈자리를 공백으로 채움 |
- | 왼쪽 정렬하고 빈자리를 공백으로 채움 |
0 | 빈자리를 0으로 채움 |
. | 천 단위 구분 기호(,)를 넣고 빈자리를 공백으로 채움 |
서식 지정자에 .숫자 형태로 출력할 소수점 이하 자릿수를 넣어주면 됩니다.
상수와 리터럴
변수에 저장하는 값은 계속 바뀔 수 있습니다. 그러나 바뀌지 않는 변수는 어떻게 해야 할까요?
상수는 저장한 값이 바뀌지 않는 변수를 의미합니다. 이는 앞에 final을 붙여줍니다.
final 자료형 변수명 = 값;
상수로 선언하면 선언과 동시에 초기화하고 이후 값을 변경할 수 없습니다. 그리고 상수는 이름을 대문자로 작성합니다.
final int START_YEAR = 2025;
리터럴(literal) : 문자 그대로의 뜻으로 값을 의미합니다.
연산자
연산자(operator)는 어떤 연산을 수행할 때 사용하는 기호입니다.
산술 연산자 사용
public class Main {
public static void main(String[] args) {
System.out.println(100 + 3); // 103
System.out.println(100 - 3); // 97
System.out.println(100 * 3); // 300
System.out.println(100 / 3); // 33
}
}
자바의 / 연산자는 몫을 구하는 것이기 때문에 나눈 값을 구하기 위해서는 형변환을 해야 합니다.
변수를 사용한 사칙연산
public class Main {
public static void main(String[] args) {
int a = 100;
int b = a + 3;
System.out.println(b);
}
}
변수를 사용하면 코드가 효율적으로 바뀝니다. 바꿔야 할 경우 변수만 바꾸면 되기 때문에 훨씬 간편합니다.
구분 | 연산자 | 예 | 의미 |
대입 연산자 | = | a = b | a에 b의 값 넣기(대입) |
산술 연산자 | + | a + b | a와 b의 값 더하기 |
- | a - b | a의 값에서 b의 값 빼기 | |
* | a * b | a의 값에 b의 값 곱하기 | |
/ | a / b | a의 값을 b의 값으로 나눈 몫 | |
% | a % b | a의 값을 b의 값으로 나눈 나머지 |
+ 연산자로 문자열 연결하기
+ 연산자는 문자열을 하나로 연결하는 기능이 있습니다.
public class Main {
public static void main(String[] args) {
System.out.println(123 + 4); // 127
System.out.println("123" + 4); // 1234
}
}
형변환
형변환 : 어떤 자료형의 값을 다른 자료형으로 바꾸는 것
(자료형)변수;
public class Main {
public static void main(String[] args) {
int a = 100;
int b = 3;
float div = (float)a / (float) b; // float형으로 변환
System.out.println(div); // 33.333332
}
}
만일 뒷자리를 더 표현하고 싶다면 double로 형변환을 하면 됩니다.
값을 정확히 표현하고 싶다면 값의 크기에 맞는 자료형을 사용하는 것이 좋습니다.
자료형 | 크기 | 자료형 | 크기 | ||
정수형 | byte | 1바이트 | 실수형 | float | 4바이트 |
short | 2바이트 | double | 8바이트 | ||
int | 4바이트 | 문자형 | char | 2바이트 | |
float | 8바이트 | 논리형 | boolean | 1바이트 |
명시적 형변환과 묵시적 형변환
public class Main {
public static void main(String[] args) {
int num1 = 12;
float num2 = 12.3F;
int result = num1 + num2;
System.out.println(result);
}
}
위 코드를 실행하면 '호환되지 않는 타입(incompatible types: possible lossy conversion from float to int)'이라는 오류 메시지가 나옵니다. 이는 float형을 int형으로 변환하면 값이 손실될 수 있어서 변환이 불가능하다라는 의미입니다.
자바는 값이 손실되는 경우 형변환을 할 수 없게 자바 컴파일러가 막습니다.
강제 형변환(명시적 형변환)
명시적 형변환은 범위가 큰 자료형에서 범위가 작은 자료형으로의 변환도 허용합니다. 하지만 값은 일부 손실될 수 있습니다.
public class Main {
public static void main(String[] args) {
int num1 = 12;
float num2 = 12.3F;
int result = num1 + (int)num2;
System.out.println(result);
}
}
자동 형변환(묵시적 형변환)
묵시적 형변환은 바꿀 자료형을 명시하지 않아도 값의 범위를 파악해 자동으로 자료형이 바뀌는 것입니다. 이는 자바 컴파일러에서 자동으로 수행하며 값이 최대한 손실되지 않게 이루어집니다.
즉, int형인 num1 변수의 값이 자동으로 float형으로 형변환이 일어나는 것입니다.
public class Main {
public static void main(String[] args) {
int num1 = 12;
float num2 = 12.3F;
float result = num1 + num2;
System.out.println(result);
}
}
즉, 묵시적 형변환은 범위가 작은 자료형에서 범위가 큰 자료형으로의 변환만 허용합니다. 그러나 범위가 큰 자료형에서 범위가 작은 자료형으로 변환할 때는 반드시 명시적 형변환을 해주어야 합니다.

주석
주석은 소스코드에는 표시되나 프로그램 실행에는 영향을 주지 않는 문장입니다.
주석은 /* */ 또는 // 를 이용하면 됩니다.
조건이 하나일 때 : if-else
조건문은 조건에 따라 실행하는 명령이 달라집니다.
순서도 : 프로그램의 흐름을 파악하기 쉽게 기호와 도형으로 구조화해 나타낸 그림입니다.
public class Main {
public static void main(String[] args) {
int score = 80;
if (score >= 90) {
System.out.println("A학점입니다.");
} else {
System.out.println("A학점이 아닙니다.");
}
}
}
조건을 만족할 경우 "A학점입니다." 를 출력하고 조건을 만족하지 않는 경우 "A학점이 아닙니다."를 출력하면 됩니다.
비교 연산자
연산자 | 설명 | 연산자 | 설명 |
== | 왼쪽과 오른쪽이 같으면 참 | < | 왼쪽이 오른쪽보다 작으면 참 |
!= | 왼쪽과 오른쪽이 같지 않으면 참 | >= | 왼쪽이 오른쪽보다 크거나 같으면 참 |
> | 왼쪽이 오른쪽보다 크면 참 | <= | 왼쪽이 오른쪽보다 작거나 같으면 |
조건이 여러 개일 때 : else if
if-else문은 조건이 하나이고 조건 여러 개를 하고자 하면 else if문을 사용하면 됩니다.
else if 블록은 조건 개수에 따라 여러 번 사용할 수 있으며 모든 조건을 만족하지 않을 때는 마지막에 else 블록을 넣습니다.
if (조건1) {
실행문; // 조건 1을 만족할 때 실행할 명령문
} else if (조건2) {
실행문; // 조건 2를 만족할 때 실행할 명령문
} else if (조건3) {
실행문; // 조건 3을 만족할 때 실행할 명령문
...
} else {
실행문; // 조건을 모두 만족하지 않을 때 실행할 명령문
}
논리 연산자
연산자 | 설명 |
&& | 왼쪽과 오른쪽 모두 참이면 참 |
|| | 왼쪽과 오른쪽 중 하나라도 참이면 참 |
! | 조건을 만족하면 거짓, 조건을 만족하지 않으면 참 |
'Study > 코딩 자율학습단' 카테고리의 다른 글
[코딩 자율학습단 13기] 자바 입문 [4주차] (0) | 2025.03.19 |
---|---|
[코딩 자율학습단 13기] 자바 입문 [3주차] (0) | 2025.03.14 |
[코딩 자율학습단 13기] 자바 입문 [2주차] (0) | 2025.03.01 |