먼저, jdk는 3가지 능력을 가졌다.
.java를 .class로 바꾸는 컴파일러, JRE, 디버깅
public class Main {
public static void main(String[] args) {
System.out.println("Hello world!");
}
}
이건 이런 역할을 가진다.
- public class Main {
- 클래스 정의
- public : 클래스 경로 외부에서 실행시킬 수 있다고 표시해 주는 “접근 제어자” 입니다.
- 클래스 경로 외부에서 호출 못하도록 막는 “접근 제어자”는 private (그 외 protected 도 있음)
- class : 객체를 만드는 클래스라고 선언
- Main : 클래스 명
- 파일명과 일치 시켜야 합니다. (다르면 알림 문구가 뜹니다.)
- 그렇게 해야 Java 컴파일러가 바이트코드 변환했을 때의 파일 확장명(.class )과 일치됩니다.
- public static void main(
- main 메서드 정의
- public : 외부에서 실행시킬 수 있다고 표시해 주는 “접근 제어자” 입니다.
- static : 프로그램이 실행될때 반드시 실행됨
- 따라서 앱 실행 시 한 번만 정의되며 static 메서드 또는 변수(데이터) 끼리만 호출할 수 있습니다.
- void : 메서드의 응답 값을 정의하는 곳인데 void는 응답할 값이 없다는 정의입니다. 출력이 있으면 밑에 return을 붙이게 됨. static void 이러면 반드시 문자로 출력
- int는 정수, char는 문자, string은 문자열 등…
- (String[] args)
- 메서드가 시작될 때 넘겨받을 데이터들(변수들)
- String[] : 문자열 여러 개 데이터 타입
- args : 문자열 여러 개 데이터의 이름 (사용자가 정의한 값 아무거나 써도 됨) args123123이래도 됨
plint는 줄바꿈 안하고 plintln은 줄바꿈을 한다.
println("Hello");
println("world!"); 이러면 헬로 밑에 월드 나오는데 print로 똑같이 하면 그냥 헬로 월드! 하고 붙여버린다.
int number = 10; // 1. 선언과 동시에 값을 저장공간에 저장 (=초기화) 이러면 숫자는 10이 되고
number = 11; // 2. 선언 이후에 다른값을 저장공간에 저장. 이러면 10이 11로 일괄변경된다.
이것들은 변해서 변수라고 한다. 반대로 상수는 파이는 3.14처럼 안변하는것.
- 기본형 변수
- 논리형 변수 : boolean
- True/False 값만 저장합니다.
boolean flag = true; // 1. 논리형 변수 boolean 으로 선언 및 True 값으로 초기화 flag = false; // 2. False 값으로도 저장할 수 있습니다.
- 문자형 변수 : char
- ‘A’, ‘1’ 와 같은 문자 하나만 저장합니다.
char alphabet = 'A'; // 문자 하나를 저장합니다.
- 정수형 변수 : byte, short, int, long
- 0,1,2,99 와 같은 정수형 숫자 값을 저장합니다.
- 정수형 변수 표현 범위
- byte : -128 ~ 127 범위의 숫자만 저장 가능합니다.
- short (2byte)는 -32,768~32,767 범위의 숫자만 저장 가능합니다.
- int (4byte)는 -21억~21억 범위의 숫자만 저장 가능합니다.
- long (8byte)은 9백경 정도의 매우 큰 수를 저장 가능합니다.
- 논리형 변수 : boolean
- 실수형 변수 : float, double
- 0.123, 0.99999 와 같은 소수점 실숫값을 저장합니다. 플롯은 4바이트, 더블은 8바이트.
- float뒤엔 f를 붙인다.float floatNumber = 0.123f; 이렇게.
- 그 둘의 차이는,
- float floatNumber = 0.123f;
- double doubleNumber = 0.123123123; 이렇게 더블이 더 크다.
- string는 문장, Object, Array, List는 List<int> alphabet = [0,1,2,3]; // 기본형 변수 여러개를 저장
boolean flag = true;
flag = false 이러면 flag는 false가 되는데 final boolean flag = true; 이러면 상수가 되어 flag = false는 작동하지 않는다.
char은 작은 따옴표 사용. ""은 문자열이 됨
sout라고 치면 자동으로 System.out.println이 됨
이런식으로 위의 byteNumber과 println안의 이름이 같아야함.
이러면 a문자열인 1,2,3을 제대로 출력함. inr[] = 이러면 안됨
이런식으로 숫자를 문자로, 문자를 숫자로 바꿔주는 아스키 코드라는게 있다.
// 숫자 -> 문자
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);
}
}
이제 실행을 누르고 창에 97을 입력하면
C:\Users\asdf\.jdks\corretto-17.0.9\bin\java.exe "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2023.3.1\lib\idea_rt.jar=54207:C:\Program Files\JetBrains\IntelliJ IDEA 2023.3.1\bin" -Dfile.encoding=UTF-8 -classpath C:\Users\asdf\Desktop\Firstjava\out\production\Firstjava Main
97
a 이런식으로 a라고 나온다.
// 문자 -> 숫자
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)
- 문자 뒤에 \0(널문자)가 없습니다. (1 byte만 쓰기 때문에 끝을 알아서 데이터만 저장하면 됩니다.) 작은 따옴표
- 문자열 (String)
- 문장의 끝에 \0(널문자)가 함께 저장이 됩니다. (몇 개의 byte를 쓸지 모르기 때문에 끝을 표시해야 합니다.) 큰 따옴표
Stack 영역 vs Heap 영역
- Stack의 경우에는 정적으로 할당된 메모리 영역입니다.
- 그래서, 크기가 몇 byte 인지 정해져 있는 기본형 변수를 저장합니다.
- 추가로, 크기가 정해져 있는 참조형 변수의 주솟값도 저장합니다.
- Heap의 경우에는 동적으로 할당된 메모리 영역입니다.(동적이란건 알수없을때, 몇글자인지 모른다던가)
- 그래서, 크기가 계속 늘어날 수 있는 참조형 변수의 원본을 저장합니다.