데이터 : 컴퓨터가 정보를 담는 자료값
데이터 타입(자료형) : 데이터의 유형 ex. 정수/문자/부동소수(소숫점)
자료구조 : 데이터 여러개를 분류해서 담을 수 있는 분류통
문맥 : 문맥이라 함은 개발언어로 표현한 프로그램의 동작 흐름을 의미합니다. 이케아 가구 조립 설명서, 밀키트 요리 레시피에 조건에 따른 문맥이 있듯이 프로그램도 문맥을 가지고 있습니다.
메서드 : 데이터와 문맥을 감싸는 포장지
공통 실행환경 : 여러 기기의 운영환경에서 실행 할 수 있도록 판을 깔아주는 실행환경
운영체제 : 기기가 프로그램을 실행시키는 운영 환경 (ex. Window, Android, IOS, Linux)
컴파일러 : 코드(.java파일)을 운영체제가 읽을 수 있는 바이트 코드(.class 파일)로 변환하는 변환기
인터프리터 : Java .class 코드 해석기, 운영체제가 읽은 바이트 코드를 기기가 실행할 수 있는 기계어로 번역
JIT 컴파일러 : 빠른 Java.class 코드 해석기, 인터프리터의 효율을 올려주는 서포트 해석기
메모리 영력 : Java 데이터를 저장하는 영역, 운영체제로 부터 JVM이 할당 받은 메모리 영력
클래스 로더 : Java.class 바이트 코드를 메모리 영역에 담는 운반기, JVM으로 class(바이트코드)를 불러와서 메모리에 저장함
가비지 컬렉터 : Java 쓰레기 청소기, 메모리 영역에서 안쓰는 데이터를 주기적으로 흡수해가는 청소기
JRE : Java Runtime Environment 즉, 자바 실행 환경이라는 뜻
.class 파일만 실행 가능
JDK : Java Development Kit 즉, 자바 개발 키트라는 뜻
.java 파일들을 .class 파일로 변환해 주는 Java Compiler(javac)의 기능이 있다.
JDK는 코드를 디버깅하는 Jdb 등의 기능을 가지고 있다.
디버깅 : 중단점 일시정지 + 코드 라인단위 수행
변수 : 지속적으로 변화하는 수
상수 : 값이 변하지 않는 수
ex.
final int number = 10 // 1. 상수로 선언한다.
number = 11; // 변수(number)의 값을 변경하려고하면 오류가 발생한다.
아스키코드 : 숫자를 문자로 매핑하는 코드입니다.
A : 65 a : 97 문자 "0"은 80 으로 매핑
(1) 논리형 변수 : boolean
True/False 값만 저장합니다.
boolean flag = true; // 1. 논리형 변수 boolean 으로 선언 및 True 값으로 초기화
flag = false; // 2. False 값으로도 저장할 수 있습니다.
(2) 문자형 변수 : char
‘A’, ‘1’ 와 같은 문자 하나만 저장합니다.
char alphabet = 'A'; // 문자 하나를 저장합니다.
(3) 정수형 변수 : byte, short, int, long
0,1,2,99 와 같은 정수형 숫자 값을 저장합니다.
byte : -128 ~ 127 범위의 숫자만 저장 가능합니다.
short (2byte)는 -32,768~32,767 범위의 숫자만 저장 가능합니다.
int (4byte)는 -21억~21억 범위의 숫자만 저장 가능합니다.
long (8byte)은 9백경 정도의 매우 큰 수를 저장 가능합니다.
(4) 실수형 변수 : float, double
float (4byte) : 3.4 * -10^38 ~ 3.4 * 10^38(long 보다 큼) 범위의 숫자 저장이 가능합니다.
double (8byte) : 1.7 * -10^308 ~ 1.7 * 10^308(long 보다 큼) 범위의 숫자 저장이 가능합니다.
(1) 문자열 변수 : String
“Apple”, “텍스트” 와 같은 문장을 저장합니다.
String message = "Hello World"; // 문자열을 저장합니다.
(2) 그 외 : Object, Array, List
객체, 배열, 리스트와 같은 단일 저장공간에 담을 수 없는 값을 저장합니다
List<int> alphabet = [0,1,2,3]; // 기본형 변수 여러개를 저장합니다.
래퍼 클래스(Wrapper Class)라는 말 그대로 “기본형 변수를 클래스로 한번 랩핑(감싸는) 변수”라고 생각하시면 됩니다.
기본형 변수 타입명에서 첫 글자를 대문자로 바꾸어서 래퍼 클래스를 정의해 주었습니다.
기본 타입 / 래퍼 클래스
byte / Byte
short / Short
int / Integer
long / Long
float / Float
double / Double
char / Character
boolean / Boolean
// 박싱 VS 언박싱
// 박싱
// Integer 래퍼 클래스 num 에 21 의 값을 저장
int number = 21;
Integer num = number; //새로운 변수 창출
// 언박싱
int n = num.intValue(); // 래퍼 클래스들은 inValue() 같은 언박싱 메서드들을 제공해줍니다.
System.out.println(num.intValue()); //출력단에서의 언박싱
```java
char alphabet = 'A'; // 문자 하나를 저장합니다.
```
(2) 문자열 (String) ```java
String message = "Hello World"; // 문자열을 저장합니다.
```

stack의 경우에는 정적으로 할당된 메모리 영역입니다.
Heap의 경우에는 동적으로 할당된 메모리 영역입니다.
Java Virtual Machin 의 약자로 "자바 가상 머신"이라는 뜻을 가지고 있습니다.
가상 머신이란 가상의 기기를 만들어주는 것을 의미합니다.
다시 말해서, 여러가지의 기기위에 Java 프로그램을 실행시킬 수 있는 가상의 기기를 만들어주는것을 의미합니다.
어느 장비(PC,모바일,서버 등..)에서든 JVM을 깔아주면 Java가 놀 수 있는 놀이터가 됩니다.

JVM 놀이터의 구성도

(1) JDK 설치
https://adoptium.net/
위 경로로 들어가서 17 버전 .msi로 다운 받기
.msi 파일을 실행하고 Location 설정이 나오면 Browse 버튼을 눌러 설치위치를 수정해줍니다.
설치위치 수정팝업이 뜨면 ₩EclipseAdoptium₩ 이라고 적혀있는 경로를 ₩Java₩ 로 수정해주고 OK를 누릅니다.
Set JAVA_HOME variable 왼쪽에 X버튼을 클릭하고 Will be installed on local hard drive 를 클릭합니다.
설치가 완료되면, 시스템 환경변수를 확인하기 위해 시스템 속성 > 고급 > 환경변수 버튼을 클릭해줍니다.
환경 변수 팝업 > 시스템 변수 목록에 JAVA_HOME 이 있는지 확인합니다
만약 없다면 시스템 환경 변수에 JAVA_HOME 경로를 추가해줍니다.
(2) IntelliJ 설치
https://www.jetbrains.com/ko-kr/idea/download/
사이트에 접속하여 설치하면 됩니다.
(3) IntelliJ 실행
설치된 IntelliJ 을 실행하여 실습을 진행합니다.
// 클래스
// public : (접근)제어자, public(공공의, 공동의)
public class Main {
// JDK
// (1) compiler : .java -> .class
// (2) JDE
// (3) JDB : 디버깅(버그를 없애는 과정)
// () : 소괄호
// {} : 중괄호
// [] : 대괄호
// main 메소드
// 자바 프로젝트는, 제일 먼저 클래스의 main 메소드를 실행시킨다.
// = JVM의 약속
// static : 이 프로그램이 시작될 때 무조건 실행되는 녀석임을 표현
// void 메서드의 출력값의 데이터 타입 (output)
// void : "아무것도 없다." -> 출력은 없다.
// String[] args : 매개 변수 자리(input)
// arg : 변수로서 어떤 문자가 들어가도 상관 없음
// description(주석) : // 으로 표현
public static void main(String[] args) {
// 객체 : 특징(속성, 변수), 행동(메소드)
// print, println : 줄 변환을 시켜줄려면 println 을 사용해야함
// 문자열을 출력할 때는 ""을 대입, ex "자바"
System.out.println("0ur First Project! :)");
}
}
자바의 가장 기본적인 틀에 대해 주석으로 설명하였습니다.
// 숫자 -> 문자
// import : im(in) + port(항구)
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int asciiNumber = sc.nextInt();
char ch = (char)asciiNumber; // 문자로 형변환을 해주면 숫자에 맞는 문자로 표현됩니다.
System.out.println(ch);
}
}
숫자를 문자로 아스키코드를 이용하여 형변환 하였습니다.
// 문자 -> 숫자
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
char letter = sc.nextLine().charAt(0); // 첫번째 글자만 받아오기위해 charAt(0) 메서드를 사용합니다.
int asciiNumber = (int)letter; // 숫자로 형변환을 해주면 저장되어있던 아스키 숫자값으로 표현됩니다.
System.out.println(asciiNumber);
}
}
문자를 숫자로 아스키코드를 이용하여 형변환 하였습니다.

// 문자 -> 숫자
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// 실수 -> 정수
// double형 or float형 -> int
// 실수 -> 정수(0.xxxxxx -> 0)
double doubleNumber = 10.101010;
float floatNumber = 10.1010f;
// 변환(int)
// int intNumber;
// intNumber = (int) floatNumber;
// System.out.println("Float Type =>" + floatNumber);
// System.out.println("Int Type =>" + intNumber);
// inNumber = (int)doubleNumber;
// System.out.println("Double Type =>" + doubleNumber);
// System.out.println("Int Type =>" + inNumber);
}
}
실수를 정수로 변환하는 코드 입니다.

// 문자 -> 숫자
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// 정수 -> 실수
int intNumber = 10;
double doubleNumber = (double) intNumber;
float floatNumber = (float) intNumber;
System.out.println("intNumber => " + intNumber);
System.out.println("doubleNumber => " + doubleNumber);
System.out.println("floatNumber => " + floatNumber);
}
}
정수를 실수로 변환하는 코드 입니다.

public class Main {
public static void main(String[] args) {
// 변수 타입별 크기 순서
// byte(1) -> short(2) -> int(4) -> long(8) -> float(4) -> double(8)
// (1) byte -> int
byte byteNumber = 10;
int intNumber = byteNumber;
System.out.println(intNumber);
// (2) char(1 byte) -> int(4) 형변환
char charAlphabet = 'A';
intNumber = charAlphabet;
System.out.println(intNumber);
// int -> long number 형변환
intNumber = 100;
long longNumber = intNumber;
System.out.println(longNumber);
// int -> double 형 변환
intNumber = 200;
double doubleNumber = intNumber;
System.out.println(doubleNumber);
}
}
각형태에 따라 형변환을 하는 과정입니다.

public class Main {
public static void main(String[] args) {
// 작은 크기의 타입이 큰 크기의 타입과 '계산'될 때,
// 자동으로 큰 크기의 타입으로 형 변환이 됩니다.
int intNumber = 10;
double doubleNumber = 5.5;
double result = intNumber + doubleNumber;
System.out.println("Plus => " + result);
// 1)정수로 나누기
int iResult = intNumber /4; //2.5로 나올거 같지만 정수형이기 때문에 .5를 버림
// 2)실수로 나누기
double dResult = intNumber / 4.0;
System.out.println(iResult + " / " + dResult);
// 자동 형변환과 강제 형변환
//
// - `작은 타입` > `큰 타입` 형변환 시 (자동 형변환)
// - 더 큰 표현 범위를 가진 타입으로 변환되는 것이라 값의 손실이 없습니다.
// - 값의 손실 없이 변환이 가능하기 때문에 컴파일러가 자동으로 형변환을 해줍니다.
// - `큰 타입` > `작은 타입` 형변환 시 (강제 형변환 = 캐스팅)
// - 더 작은 표현 범위를 가진 타입으로 변환된는 것이라 값의 손실이 생깁니다.
// - 값의 손실이 생기기 때문에 자동으로 형변환을 해주지 않고 개발자가 선택하여 형변환을 합니다.
}
}
정수형과 실수형의 나누기를 통해 자동 형변환과 강제 형변환을 주석으로 표시하였습니다.

요리 레시피 메모장 만들기
입력값 :
내가 좋아하는 요리 제목을 먼저 입력합니다.
요리 별점을 1~5 사이의 소수점이 있는 실수로 입력해 주세요. (ex. 3.5)
이어서 내가 좋아하는 요리 레시피를 한 문장씩 10문장을 입력합니다.
출력값 :
입력이 종료되면 요리 제목을 괄호로 감싸서 먼저 출력해 줍니다.
이어서, 요리 별점을 소수점을 제외한 정수로만 출력해 줍니다. (ex. 3)
바로 뒤에 정수 별점을 5점 만점 퍼센트로 표현했을 때 값을 실수로 출력해 줍니다. (ex. 60.0%)
이어서, 입력한 모든 문장 앞에 번호를 붙여서 모두 출력해 줍니다.
예시 입력 :
백종원 돼지고기 김치찌개 만들기
4.5
돼지고기는 핏물을 빼주세요.
잘익은 김치 한포기를 꺼내서 잘라주세요.
냄비에 들기름 적당히 두르고 김치를 넣고 볶아주세요.
다진마늘 한스푼, 설탕 한스푼 넣어주세요.
종이컵으로 물 8컵 부어서 센불에 끓여주세요.
핏물 뺀 돼지고기를 넣어주세요.
된장 반스푼, 양파 반개, 청양고추 한개를 썰어서 넣어주세요.
간장 두스푼반, 새우젓 두스푼, 고춧가루 두스푼반 넣어주세요.
중불로 줄여서 오래 끓여주세요~!!
마지막에 파 쏭쏭 썰어서 마무리하면 돼요^^
예시 출력:
백종원 돼지고기 김치찌개 만들기
별점 : 4 (80.0%)
1. 돼지고기는 핏물을 빼주세요.
2. 잘익은 김치 한포기를 꺼내서 잘라주세요.
3. 냄비에 들기름 적당히 두르고 김치를 넣고 볶아주세요.
4. 다진마늘 한스푼, 설탕 한스푼 넣어주세요.
5. 종이컵으로 물 8컵 부어서 센불에 끓여주세요.
6. 핏물 뺀 돼지고기를 넣어주세요.
7. 된장 반스푼, 양파 반개, 청양고추 한개를 썰어서 넣어주세요.
8. 간장 두스푼반, 새우젓 두스푼, 고춧가루 두스푼반 넣어주세요.
9. 중불로 줄여서 오래 끓여주세요~!!
10. 마지막에 파 쏭쏭 썰어서 마무리하면 돼요^^
내가 작성한 코드 :
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
System.out.println("맛있는 컵라면 만들기");
double a = 4.5;
int b;
double c;
b = (int)a;
c = (double) 100*b/5;
System.out.println("별점: " + b + " (" + c + "%)");
System.out.println("컵라면에 봉지를 뜯어주세요");
System.out.println("컵라면에 뚜겅을 열고 스프를 넣어주세요");
System.out.println("컵라면에 뜨거운 물을 넣어줍니다");
System.out.println("3분 기다려주세요");
System.out.println("맛있게 드시면 됩니다");
}
}
출력결과 :

회고 :
형변환에 어려움을 느꼈지만 많은 반복을 통해 극복 할 수 있었습니다.