오늘 한일
1. java 강의 1주차 듣기
오늘 배운 것
jvm 공통 실행환경
클래스와 객체!
java 를 많이 쓰는 이유
1) Java는 공통 실행환경이 있어서 여러 기기에서 실행 가능합니다.
2) Java는 세상과 닮아있는 개발 언어라 코드를 이해하기 쉽고 유지 보수가 쉽습니다.
(대표적 객체지향 언어)
3) Java는 안정성이 높아서 프로그래밍 오류를 방지하고 보안상 안전합니다.
4) 대규모 앱 개발이 가능합니다.
5) Java를 배우면 다양한 개발 도구와 라이브러리를 사용할 수 있습니다.
jvm
Java Virtual Machine의 약자로 “자바 가상 머신”이라는 뜻을 가지고 있습니다.
여러 가지의 기기 위에 Java 프로그램을 실행시킬 수 있는 가상의 기기를 만들어주는 것을 의미
똑같이, 어느 장비(PC,모바일,서버 등..)에서든 JVM 을 깔아주면 Java 가 놀 수 있는 놀이터가 됩니다
바이트 코드
java 프로그램 변환코드
내가 작성한 코드가 운영체제가 읽을 수 있는 코드(바이트 코드)로 Java 컴파일러가 변환한 코드
(*compiler java파일 -> class파일 로 변환 시켜주는것)
인터프리터
java.class 코드 해석기
운영체제가 읽은 바이트 코드를 기기(기계)가 실행할 수 있는 기계어로 번역
JIT 컴파일러
빠른 Java .class 코드 해석기
- 인터프리터의 효율을 높여주는 서포터 해석기
메모리 영역
Java 데이터를 저장하는 영역
- 운영체제로부터 JVM이 할당받은 메모리 영역
클래스 로더
Java .class 바이트 코드를 메모리 영역에 담는 운반기
- JVM으로 class(바이트 코드)를 불러와서 메모리에 저장함
가비지 컬렉터
Java 쓰레기 청소기
- 메모리 영역에서 안 쓰는 데이터를 주기적으로 흡수해가는 청소기
Java 의 놀이터 구성하기 (개발환경 구성)
- Java의 놀이터인 JVM 을 설치하는 방법은 JRE를 설치하는 것입니다.
- JRE는 Java Runtime Environment 즉, 자바 실행 환경이라는 뜻을 가지고 있습니다.
- 하지만, JRE(JVM)만 있다면 Java 프로그램을 실행만 시킬 수 있습니다.
- JRE는 `.class` 파일만 실행 가능합니다.
- JDK 가 `javac` 명령을 통해 `.java` 파일을 실행 가능한 `.class` 파일로 변환해 줍니다.
@@@@
- Java의 놀이터 기능과 함께 Java 프로그램을 개발할 수 있는 JDK라는 것이 있습니다.
- JDK는 Java Development Kit 즉, 자바 개발 키라는 뜻을 가지고 있습니다.
- 우리는 Java 프로그램을 개발할 것이기 때문에 JDK를 설치하겠습니다.
- JDK는 아래 그림처럼 JRE(JVM)의 기능을 포함하고 있습니다.
- JDK는 .java 파일들을 .class 파일들로 변환해 주는 Java Compiler(javac) 기능이 있습니다.
- JDK는 코드를 디버깅하는 jdb 등의 기능이 있습니다.
자바 프로젝트(앱)는, 제일 먼저 클래스의 main 메소드를 실행시킨다.
=jvm의 약속
//클래스
//public : (접근)제어자, public(공공의, 공통의)
public class Main {
//main 메소드
//static : 이 프로그램이 시작될 때 무조건 시작되는 녀석임을 표현
//output
//void : 메서드의 출력값의 데이터 타입
//void : "아무것도 없다." -> 출력이 없다.
//input
//String[] args : 매개변수 자리
public static void main(String[] args) {
//객체 : 특징(속성, 변수), 행동(메소드)
//print -> 줄 바꿈은 하지 x
//println -> 줄 바꿈 o
//ln : line
System.out.println("Our First Project!");
System.out.println("Our First Project!");
}
}
변수 : 변하는 저장 공간
상수 : 변하지 않는 저장 공간
final int number = 10; // 상수로 선언
number = 11; //에러남
저장공간의 종류
기본형 : 숫자, 문자, boolean
참조형 : 뭔가 복잡한(별도 저장)
기본형 변수
-논리형 변수 : boolean
- True/False 값만 저장합니다.
-문자형 변수 : char
- ‘A’, ‘1’ 와 같은 문자 하나만 저장합니다. ('' 사용)
-정수형 변수 : byte, short, int, long
- byte : -128 ~ 127 범위의 숫자만 저장 가능합니다.
- short (2byte)는 -32,768~32,767 범위의 숫자만 저장 가능합니다.
- int (4byte)는 -21억~21억 범위의 숫자만 저장 가능합니다.
- long (8byte)은 9백경 정도의 매우 큰 수를 저장 가능합니다.
long longNumber = 2147483647L; // L을 붙여줘야한다.
-실수형 변수 : float, double
-float floatNumber = 0.123f; // f를 붙여줘야한다.
-double doubleNumber = 0.123123123;
참조형 변수
-문자열 변수 : String
-그 외 : Object, Array, List
래퍼 클래스 변수
-래퍼 클래스(Wrapper Class)라는 말 그대로 “기본형 변수를 클래스로 한번 랩핑(감싸는) 변수”라고 생각하시면 됩니다.
❓ 왜, 굳이 래퍼 클래스를 사용하는 건가요?
클래스는 객체지향 언어인 Java의 핵심 기능인데요. 그렇기 때문에 클래스로 변수를 관리하면 객체지향의 많은 기능을 사용할 수 있게 됩니다!!
//숫자-> 문자
//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);
}
}
- 문자 (char)
- 문자 한 개만 저장하며 따옴표를 사용하여 값을 지정합니다. (ex. ’A’)
- 문자 뒤에 \0(널문자)가 없습니다.
(1 byte만 쓰기 때문에 끝을 알아서 데이터만 저장하면 됩니다.)
- 기본형!!
- 문자열 (String)
- 문자 여러 개를 문장 형태로 저장하며 쌍따옴표를 사용하여 범위를 지정합니다. (ex. “ABCDEFG”)
- 문장의 끝에 \0(널문자)가 함께 저장이 됩니다.
(몇 개의 byte를 쓸지 모르기 때문에 끝을 표시해야 합니다.)
- 참조형!!
- Stack의 경우에는 정적(정해져 있다)으로 할당된 메모리 영역입니다.
- 그래서, 크기가 몇 byte 인지 정해져 있는 기본형 변수를 저장합니다.
- 추가로, 크기가 정해져 있는 참조형 변수의 주솟값도 저장합니다.
- Heap의 경우에는 동적(알 수 없을 때)으로 할당된 메모리 영역입니다.
- 그래서, 크기가 계속 늘어날 수 있는 참조형 변수의 원본을 저장합니다.
@@@@이부분 이해안됨@@@
- Byte(바이트)는 8개의 Bit(비트)로 구성되어 있습니다.
- 1 Byte 내에서 숫자 변수는 Bit 2진수를 10진수로 저장(표현)을 합니다.
- 10진수로는 0~255(2의8승)까지 저장(표현) 합니다.
- 1 Byte 내에서 문자 변수의 경우만 Bit 2진수를 16진수로 저장(표현) 합니다.
형변환
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 = " + intNumber);
// (3) int(4) -> long(8)
intNumber = 100;
long longNumber = intNumber;
System.out.println("longNumber = " + longNumber);
// (4) int -> double 형 변환
intNumber = 200;
double doubleNumber = intNumber;
System.out.println("doubleNumber = " + 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;
System.out.println("iResult = " + iResult);
// 2) 실수로 나누기
double dResult = intNumber/4.0;
System.out.println("dResult = " + dResult);
}
}
오늘 고민한 문제
💁♀️ 요리 레시피 메모장 만들기
- 입력값
- 내가 좋아하는 요리 제목을 먼저 입력합니다.
- 요리 별점을 1~5 사이의 소수점이 있는 실수로 입력해 주세요. (ex. 3.5)
- 이어서 내가 좋아하는 요리 레시피를 한 문장씩 10문장을 입력합니다.
- 출력값
- 입력이 종료되면 요리 제목을 괄호로 감싸서 먼저 출력해 줍니다.
- 이어서, 요리 별점을 소수점을 제외한 정수로만 출력해 줍니다. (ex. 3)
- 바로 뒤에 정수 별점을 5점 만점 퍼센트로 표현했을 때 값을 실수로 출력해 줍니다. (ex. 60.0%)
- 이어서, 입력한 모든 문장 앞에 번호를 붙여서 모두 출력해 줍니다.
ex) 입력 예시
백종원 돼지고기 김치찌개 만들기
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) {
String title ;
double point ; //입력을 실수로 받기위해 실수형 변수
String post1 ;
String post2 ;
String post3 ;
String post4 ;
String post5 ;
String post6 ;
String post7 ;
String post8 ;
String post9 ;
String post10 ;
String empty ;
// sc.next() 는 한단어씩
// sc.nextLine()은 한 줄을 통째로 받아온다.
Scanner sc = new Scanner(System.in);
title = sc.nextLine();
point = sc.nextDouble();
empty = sc.nextLine();
// 숫자를 읽는 nextInt()나 nextDouble() 뿐 아니라 next() 다음에 nextLine()을 쓸 때도
// 버퍼에 남아있는 개행문자(줄바꿈문자, 엔터같은)를 없애야 해서
// nextLine() 한번 더 써야한다.
post1 = sc.nextLine();
post2 = sc.nextLine();
post3 = sc.nextLine();
post4 = sc.nextLine();
post5 = sc.nextLine();
post6 = sc.nextLine();
post7 = sc.nextLine();
post8 = sc.nextLine();
post9 = sc.nextLine();
post10 = sc.nextLine();
int intPoint;
intPoint = (int)point;
System.out.println("[ " + title +" ]");
System.out.println("별점 : " + intPoint +" ("+ (intPoint*20) + "%)" );
System.out.println("1. " + post1);
System.out.println("2. " + post2);
System.out.println("3. " + post3);
System.out.println("4. " + post4);
System.out.println("5. " + post5);
System.out.println("6. " + post6);
System.out.println("7. " + post7);
System.out.println("8. " + post8);
System.out.println("9. " + post9);
System.out.println("10. " + post10);
}
}
고민했던 부분
1. 문장으로 입력 받는법
2. 평점을 입력받은 다음 개행문자가 자꾸 받아진다.
내가 한 해결
1. sc.next()는 한단어씩만 입력을 받기에 sc.nextLine()으로 한문장씩 받기.
2. 평점을 받고나서 개행문자가 계속 다음에 포함되어 개행문자를 받아주는 empty변수로 개행문자를 없애주었다.
// 숫자를 읽는 nextInt()나 nextDouble() 뿐 아니라 next() 다음에 nextLine()을 쓸 때도
// 버퍼에 남아있는 개행문자(줄바꿈문자, 엔터같은)를 없애야 해서
// nextLine() 한번 더 써야한다.
정답
해설 답으로 나온 것을 확인해보면 개행문자를 받지않고, 입력값 받는 순서도 다르다.
답처럼 하면 마지막에 float로 받는 것이라 개행문제가 넘어가는 것을 신경쓰지 않아도 된다.
대신 입력순서를 바꾸어야한다.
&& 해설강좌에선 신기하게도 개행문자가 다음 nextLine()에 들어가지 않고 적상작동한다, 튜터님께 질문을 하였지만
답을 듣지 못하였다. (일단 강좌가 이상할 가능성이 높다!라는 답 들음) &&
@@ 해설강좌에도 윗부분 개행문자가 들어간다, 아랫부분의 실수때문에 윗부분을 집중못했다.@@
import java.util.Scanner;
public class First_project {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String cookName = sc.nextLine();
String recipe1 = sc.nextLine();
String recipe2 = sc.nextLine();
String recipe3 = sc.nextLine();
String recipe4 = sc.nextLine();
String recipe5 = sc.nextLine();
String recipe6 = sc.nextLine();
String recipe7 = sc.nextLine();
String recipe8 = sc.nextLine();
String recipe9 = sc.nextLine();
String recipe10 = sc.nextLine();
float score = sc.nextFloat();
int scoreNumber = (int)score; // 별점 int 형 변환
double percentage = scoreNumber * 100 / 5; // 퍼센트 계산
// 결과 출력
System.out.println(score);
System.out.println("[ " + cookName + " ]");
System.out.println("별점 : " + scoreNumber + " (" + percentage + "%)");
System.out.println("1. " + recipe1);
System.out.println("2. " + recipe2);
System.out.println("3. " + recipe3);
System.out.println("4. " + recipe4);
System.out.println("5. " + recipe5);
System.out.println("6. " + recipe6);
System.out.println("7. " + recipe7);
System.out.println("8. " + recipe8);
System.out.println("9. " + recipe9);
System.out.println("10. " + recipe10);
}
}
'java' 카테고리의 다른 글
getter&setter (0) | 2024.07.29 |
---|---|
객체지향 (0) | 2024.07.26 |
list, map (1) | 2024.07.25 |
연산자, 조건문 (Sql 조금) (1) | 2024.07.24 |
package (0) | 2024.07.18 |