[혼공자] 1주차 혼자 시작하는 자바
혼공학습단을 시작하다
이번 2024년 겨울 목표를 세우는 도중, 한빛미디어에서 진행하는 혼공학습단 13기 신청 홍보가 눈에 띄었다. 평소 대학 내 동아리에서만 스터디를 진행했는데, 이번에는 많은 사람들과 스터디를 진행하고 싶어 혼공학습단 13기에 지원했다.
합격 이메일!!
도서는 이미 갖고 있어서 추가로 구매하지는 않았다.
(혼공족장님 모양 책갈피가 탐나긴 했다.)
내가 지원한 학습단은 혼공자로 혼자 공부하는 자바 커리큘럼을 쭉 따라는 것이다.
커리큘럼은 위와 같은데, 각 주차에 맞는 진도를 학습한 뒤, 블로그 등에 숙제와 함께 공부했음을 인증해야 한다. (바로 지금 이 글처럼)
1주차는 1-3장까지의 내용으로 각각
- 자바 시작하기
- 변수와 타입
- 연산자
를 배우는 단원이다.
자바를 배우는 것은 이번이 처음이지만, 기존에 C언어와 파이썬 기초를 학습한터라 기초 내용은 빠르게 훑고 지나가며 기존에 내가 배운 언어들과 차이점을 위주로
노션에 기록하며 공부했다.
학교 공부를 할 때처럼 각 단원별로 정리했다.
아래는 노션에 각 단원별로 정리한 내용이다.
01 자바 시작하기
자바의 특징
- 모든 OS에서 실행 가능
- 객체 지향 프로그래밍
- 메모리 자동 정리
자바 프로그램 개발 과정
자바 프로그램 실행 순서
자바 소스 파일 → javac 컴파일 → 바이트 코드 파일 → 기계어 번역 → 실행
- 자바 소스 파일
Hello.java
를 javac 명령어를 통해 컴파일 ⇒ 바이트 코드 파일Hello.class
- 바이트 코드 파일을 완전한 기계어로 만들기 위해 JVM(자바 가상 머신)이 java 명령어를 통해 기계어로 번역 후 실행
자바 가상 머신 JVM
- OS별로 JVM이 같은 자바 소스 파일을 컴파일 한 바이트 코드(.class)를 기계어로 번역해 실행할수 있도록 함
- 윈도우, 리눅스에서 동일한 코드를 실행할 수 있는 이유
자바 코드 기초
클래스
public class Hello {
}
public class
: 클래스 선언부, 공개 클래스를 뜻함Hello
: 클래스명, 대소문자를 구별함, 소스 파일명과 동일해야함{ }
: 클래스 블록- 클래스 안에
main()
메소드 블록을 가지고 있어야 함
메소드
public static void main(String[] args) {
System.out.println("Hello, Java");
}
public static void main(String[] args)
: 메소드 선언부main
: 메소드 이름- java 명령어 실행 시 main을 가장 먼저 실행
주석
//
: 한 줄 주석/* ... */
: 범위 주석/** ... */
: 도큐먼트 주석
세미콜론
- 자바는 main 안 실행문 끝에 세미콜론을 붙임 ( C언어와 동일 )
02 변수와 타입
변수
- 메모리 주소에 붙이는 이름
- 자바는 변수에 타입을 지정해 해당 타입의 값만을 저장할 수 있음
-
변수타입 변수명;
으로 선언int age; int age1, age2; // 콤마로 한 번에 선언도 가능
- 변수 규칙
- 시작글자 : 문자, $, _
- 대소문자 구분
- camelCase가 관례
- 시작은 소문자 단어 구분은 대문자로
- 예약어 사용 불가
- 문자 수 길이 제한 없음
- 변수 사용 범위 : 블록 내에서 선안되고 사용됨 ⇒ C언어와 동일
변수 타입
데이터 타입 | 자료형 |
---|---|
정수 타입 | byte, char, short, int, long |
실수 타입 | float, double |
논리 타입 | boolean |
- 정수 타입
- char 타입
- 작은따옴표
''
로 감싼 것
- 작은따옴표
- string 타입
- 큰따옴표
""
로 감싼 것
- 큰따옴표
- char 타입
- 실수 타입
- float
- 선언 시 f나 F를 붙이지 않으면 컴파일 에러 발생
float abc = 123.456F;
- 선언 시 f나 F를 붙이지 않으면 컴파일 에러 발생
- float
타입 변환
자동 타입 변환
- 값의 범위가 작은 것에서 큰 것으로 변함
- ex. short → int
- 연산 중 자동 형 변환
- 정수형 연산 시, int 형으로 자동 변환되어 연산 수행
- 실수형 연산 시, double형이 피연산자로 존재하면 다른 피연산자도 double형으로 형변환
-
문자열 + 숫자 연산시, 숫자를 문자열로 자동 형변환
String str = "3" + 7; // 결과는 "3" + "7"과 같은 "37"이다
강제 타입 변환
-
캐스팅 연산자
(연산자)
사용int intValue = 10; double doubleValue = (double) intValue; // 10.0 저장
문자열 강제 타입 변환
- (int)str 처럼 캐스팅 연산자를 사용할 수 없다
- 대신 Integer.parseInt();를 사용해야 한다
기본 타입 | 변환 메서드 | 예시 |
---|---|---|
int | Integer.parseInt(str) |
int num = Integer.parseInt("123"); |
long | Long.parseLong(str) |
long num = Long.parseLong("123456789"); |
float | Float.parseFloat(str) |
float num = Float.parseFloat("12.34"); |
double | Double.parseDouble(str) |
double num = Double.parseDouble("12.34"); |
byte | Byte.parseByte(str) |
byte num = Byte.parseByte("127"); |
short | Short.parseShort(str) |
short num = Short.parseShort("100"); |
시스템 입출력
출력
System.out.println("출력 내용");
- println() : 출력 후 개행
- print() : 출력만
- printf(”형식문자열”, 값1, 값2, … ) : 형식문자열대로 내용 출력
printf("나이 : %d", 25);
: 나이 : 25 로 출력됨
형식 문자열
% [argument_index$] [flags] [width] [.precision] conversion
[argument_index$]
: 값의 순선[flags]
: -, 0- -: 왼쪽 자리부터 채운다, 남은 자리는 공백
- 0: 남은 자리를 0으로 채운다
[width]
: 전체 자릿수[.precision]
: 소수 자릿수conversion
: 변환 문자- 예
System.out.printf("이름: %2$s. 나이: %1$d", 25, "java");
→ 이름: java 나이: 25
입력
System.in.read();
- 표준 입력에서 하나의 바이트(ASCII 코드 값)를 읽어들입니다. 따라서 실제로 읽은 값은 문자(char)가 아니라 정수(int)입니다. 이를 문자로 변환하려면 형 변환을 사용해야 합니다.
Scanner scanner = new Scanner();
String inputData = scanner.nextLine();
- Scanner 객체를 선언한 뒤 한 줄을 입력받을 수 있음
03 연산자
연산자 종류
- 부호 연산자는 int 타입을 반환
-
instanceof
: 객체가 특정 클래스 또는 서브클래스의 인스턴스인지 확인하는 데 사용, 주로 타입을 확인하거나 다운캐스팅 전에 객체의 타입을 검증하는 데 사용 (교재에 없어 GPT의 답변을 참조했다)object instanceof ClassName
- object: 검사하려는 객체
- ClassName: 비교하려는 클래스나 인터페이스
instanceof
의 결과는 boolean 값
&&
,||
: 앞의 피연산자가 각각 false, true라면 뒤의 피연산자를 평가하지 않고 false, true 결과 반환&
,|
: 앞의 피연산자의 값과 관계 없이 뒤의 피연산자를 평가함
연산자 우선순위
숙제01 JDK 설치 인증
Springboot3 실습을 위해 설치했던 IntelliJ와 JDK21이 있어 그대로 활용했다. IDE의 경우 혼공자에서 설명하는 이클립스를 권장하였으나 이미 설치된 IDE가 있어 그대로 사용하기로 했다.
설치된 자바의 버전은 cmd에서 java -version
으로 확인했다.
숙제02 코드 작성
p.110 (02-3) 확인 문제 9번에 들어갈 코드를 2가지 이상 작성해보기
var1부터 var4까지 + 연산을 수행해서 int 타입 result 변수에 9가 저장되도록 ( ) 에 들어갈 코드를 작성하시오
long var1 = 2L;
float var2 = 1.0f;
double var3 = 2.5;
String var4 = "3.9";
int result = **( )**;
(int)(var1+var2+var3+(int)Double.parseDouble(var4));
- 2 + 1.0 + 2.5 + 3을 정수 변환하여 9가 된다
(int)(var1 + var2 + var3 + Math.floor(Double.parseDouble(var4)));
- 1번 코드에서
(int)Double.parseDouble
을Math.floor(Double.parseDouble
로 변경해 실수를 정수로 내림했다.
- 1번 코드에서
실행 코드
public class Main {
public static void main(String[] args) {
long var1 = 2L;
float var2 = 1.8f;
double var3 = 2.5;
String var4 = "3.9";
int result1 = (int)(var1+var2+var3+(int)Double.parseDouble(var4));
int result2 = (int)(var1 + var2 + var3 + Math.floor(Double.parseDouble(var4)));
System.out.println("result1 = "+result1);
System.out.println("result2 = "+result2);
}
}