코딩과 결혼합니다

[Java 문법 종합반] 1주차 : JVM, 변수 본문

2세/Java

[Java 문법 종합반] 1주차 : JVM, 변수

코딩러버 2023. 5. 23. 16:45
728x90

코드 해석하기

public class Main {
      public static void main(String[] args) {
             System.out.println("Hello world!");
      }
}

public : "접근 제어자" 클래스 경로 외부에서 실행 시킬 수 있다고 표시해준다. (그 외 private, protected 도 있다.)

class : 객체를 만드는 클래스라고 선언

Main : 클래스 명

  * 파일명과 일치 시켜야 한다.

  * 그렇게 해야 Java 컴파일러가 바이트 코드 변환했을때의 파일 확장명(.class)과 일치 된다.

 

 

public static void main(

- main 메서드 정의

public :  외부에서 실행시킬 수 있다고 표시해주는 "접근 제어자"

static : Java  컴파일러가 바이트 코드로 변환할때 미리 정의되는 메서드 표기, 앱 실행시 한 번만 정의 됨.

           static 메서트 또는 변수(데이터) 끼리만 호출할 수 있다.

void : 메서드의 응답값을 정의하는 곳 - 응답할 값이 없다는 정의

          (*int는 정수, char는 문자, String은 문자열 등..)

 

 

(String[] args)

- 메서드가 시잘될 때 넘겨 받을 데이터들(변수들)

String[] : 물자열 여러개 데이터 타입

args : 문자열 여러개 데이터의 이름 (아무 이름이나 써도 됨)

 

 

 

 

변수

저장공간의 선언

 

값의 저장

선언과 동시에 저장 "초기화"
선언 이후에 값을 저장 "덮어쓰기"

 

 

변수와 상수

변수 : 변하는 저장공간 - 덮어쓰기가 가능

상수 : 변하지 않는 저장공간 - 변수의 값을 바꾸려 하면 에러가 난다.

 

 

논리형 번수 : boolean

 - True/Flase

 

 

문자형 변수 : char

- 문자 하나만 저장 'A',  '1'

 

 

정수형 변수 : byte, short, int, long

byte byteNumber = 127; // byte -128 ~ 127 범위의 숫자만 저장 가능합니다.

short shortNumber = 32767; // short -32,768~32,767 범위의 숫자만 저장 가능합니다.

int intNumber = 2147483647; // int -21~21억 범위의 숫자만 저장 가능합니다.

long longNumber = 2147483647L; // long 은 숫자뒤에 알파벳 L 을 붙여서 표기하며 매우 큰수를 저장 가능합니다.

 

 

실수형 변수 : float, double

- 소수점 실수값을 저장

float (4byte) : `3.4 * -10^38` ~ `3.4 * 10^38`(long 보다 큼)범위의 숫자 저장이 가능합니다.

double (8byte) : `1.7 * -10^308` ~ `1.7 * 10^308`(long 보다 큼)범위의 숫자 저장이 가능합니다.

 

 

참조형 변수 : Sthing, Object, Array, List ...

-객체, 배열, 리스트와 같은 단일 저장공간에 담을 수 없는 값을 저장

int[] a = {1,2,3};
System.out.println(a);

//출력값 : [I@6d311334

*참조형 데이터는 주소값을 저장한다. 그래서 주소값이 출력된 것.

int[] a = {1,2,3};
System.out.println(Arrays.toString(a));

//출력값 : [1, 2, 3]

*java에서 제공하는 Arrays 유틸리티에서 toString이라는 (Array를 String으로 바꿔주는) 기능을 이용

 

 

 

 

래퍼 클래스 변수

- 기본형 변수를 클래스로 한번 랩핑(감싸는) 변수

- 래퍼 클래스가 가지고 있는 유용한 기능들 즉, 메서드를 사용할 수 있다.

왜, 굳이 래퍼 클래스를 사용하는 건가요?

클래스는 객체지향 언어인 Java 의 핵심기능인데요. 그렇기 때문에 클래스로 변수를 관리하면 객체지향의 많은 기능을 사용할 수 있게됩니다!! 👍

-박싱&언박싱

//박싱
int number = 21;
Integer num = number;

//언박싱
System.out.println(num.intValue());

 

 

입력&출력

입력

Java 프로그램에서는 기본적으로 Scanner.in 객체의 next() 명령을 사용해서 입력받는다.

Scanner sc = new Scanner(System.in); // Scanner 객체를 new 명령어로 생성합니다.
String input = sc.next(); // sc(Scanner) .next(); 를 실행하면 input 변수에 입력한 글자를 받을 수 있습니다.

출력

Java 프로그램에서는 기본적으로 Scanner.out 객체의 println() 명령을 사용해서 출력한다.

Scanner sc = new Scanner(System.in);
String input = sc.next();

System.out.println("입력값 : " + input); // 입력한 글자를 출력합니다.

// 실행 결과
{입력}
입력값 : {입력}

 

 

형변환

형변환 : 어떤 변수형을 다른 형식으로 변환을 해야할 경우에 쓴다. 주로 기본형 변수인 정수 ↔ 실수 ↔ 문자 들 사이에서 일어난다

 

정수 ↔ 실수

double doubleNumber = 10.101010;
float floatNumber = 10.1010

int intNumber;
intNumber = (int)doubleNumber; // double -> int 형변환
intNumber = (int)floatNumber; // float -> int 형변환

이때 실수형의 소수점 아래 자리는 버려진다.

int intNumber = 10;

double doubleNumber = (double)intNumber; // int -> double 형변환
float floatNumber = (float)intNumber; // int -> float 형변환

== 10.0 

 

 

 

자동 형변환

 

📌 변수 타입별 크기 순서

byte(1) → short(2) → int(4) → long(8) → float(4) → double(8)

 

 

🔥 자동 형변환 vs 강제 형변환

  • **작은 타입 > 큰 타입** 형변환시 (자동 형변환)
    • 더 큰 표현범위를 가진 타입으로 변환되는것이라 값의 손실이 없습니다.
    • 값의 손실없이 변환이 가능하기 때문에 컴파일러가 자동으로 형변환을 해줍니다.
  • **큰 타입 > 작은 타입** 형변환시 (강제 형변환 = 캐스팅)
    • 더 작은 표현범위를 가진 타입으로 변환된는것이라 값의 손실이 생깁니다.
    • 값의 손실이 생기기 때문에 자동으로 형변환을 해주지 않고 개발자가 선택하여 형변환을 합니다.