JAVA 문법 기초 - 1

조재형·2023년 6월 13일
0

[JDK]

(1) compiler : .java -> .class
(2) JRE
(3) JDB : 디버깅

public static void main(String[] args)
// 우리의 playground!

main 메소드
자바 프로젝트(앱)는, 제일 먼저 클래스의 main메소드를 실행시킨다.
= JVM의 약속
static : 이 프로그램이 시작될 때 무조건 실행되는 녀석임을 표현한다.

output
void : 메서드의 출력값이 데이터 타입을 정의하는 위치
"아무것도 없다." -> 출력은 없다.

input
String[] args : 매개변수 자리

객체 : 특징(속성, 변수), 행동(메소드)

논리형 변수 : boolean

boolean flag = true;

논리형 변수 boolean으로 선언 및 True값으로 초기화
불리안으로 선언한 flag라는 이름을 가진 변수
True/False 값만 저장한다.

flag = false;

False값으로도 저장할 수 있다.

문자형 변수 : char
'A', '1'와 같은 문자 <하나>만 저장한다.

분자형

char alphabet = 'A';

정수형

byte byteNumber = 127;
short shortNumber = 32367;
int intNumber = 2147483647
long longNumber = 2147483767L

실수형

float floatNumber = 0.123F; // 4byte
double doubleNumber = 0.1231231232; // 8byte

참조형

문자열 함수
String helloWorld = "Hello world!";

배열
int[] a = {1, 2, 3}
// System.out.println(a);
//이렇게 쓰면 배열의 주소값이 출력이 된다.
// => [I@4563e9ab
System.out.println(Arrays.toString(a));
// toString이라는 Array를 String으로 바꾸어주는 기능을 이용하면 된다.

++ 문자( char ) 와 문자열 ( String ) 의 차이

char 은 문자 한개만 지정하며 홑따옴표를 사용해 값을 저장

char 'Alphabet = 'A' // 문자 하나를 저장한다

문자 여러개를 문장형태로 저장하며 쌍따옴표를 사용해 범위를 지정

String message = "Hello World!" // 문자열을 저장한다

char은 문자 뒤에 \0(널문자)가 없다.
왜냐하면, 1byte만 사용하기 때문에, 끝나는 지점을 알아서 필요가 없다.
반면 String은 문장의 끝에 \0(널문자)가 함께 저장이 된다.
몇개의 바이트를 쓸 지 모르기 때문에 끝을 표시해 주어야 한다.

또, 문자형은 기본형이고, 문자열은 참조형이다.

기본형과 참조형의 차이는

기본형은 변수가 <실제 값>을 저장하는 저장공간 이라면,
참조형 변수는 실제 값을 저장하는 공간이 아닌 <원본의 주소값>을 저장한다.
다시 말해, 참조형 변수는 주소값을 저장하는 주소형 변수라고도 할 수 있다.

기본형 변수가 저장되는 공간은 Stack 영역이고,
참조형 변수(주소값)가 저장되는 공간은 Stack 영역이지만,
변수의 주소값(원본값)이 저장된 공간은 Heap 영역이다.

Stack영역은 정적(고정된 크기)으로 할당된 메모리 영역이다.
그래서 크기가 몇byte로 정해진 기본형 변수를 저장하는 곳이고,
크기가 정해져있는 참조형 변수의 주소값을 저장하는 공간이기도 하다.

Heap영역은 동적으로(크기를 알 수 없는) 할당된 메모리 영역이다.
그래서, 크기가 계속 늘어날 수 있는 참조형 변수의 원본을 저장한다.

형변환

// 형 변환 예시 : 변수의 타입을 바꾸는 방법
        // 문자열 -> 숫자
        // 정수 -> 실수
        // 실수 -> 정수

        // double형 or float형 -> int
        // 실수 -> 정수(0.xxxx ->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));

//        intNumber = (int)doubleNumber; //double -> int
//        System.out.println("Double Type => "+doubleNumber);
//        System.out.println("Int Type => "+ intNumber);

//        //정수 -> 실수
//        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);

        //변수 타입별 크기 순서
        // 숫자형에서는,
        // byte(1) -> short(2) -> int(4) -> long(8) -> float(4) -> double(8)
        // float이 더 큰 이유는 부동소수점을 사용해서.

        // (1) byte -> int
//        byte byteNumber = 10;
//        int intNumber = byteNumber;
//        System.out.println((intNumber));
//
//        // (2) char(1 byte) -> int(4) 형변환
//        char charAlphabet = 'A';
//        intNumber = charAlphabet; // char -> int로 자동 형변환
//        System.out.println(intNumber);
//
//        // (3) int -> long number 형변환
//        intNumber = 100;
//        long longNumber = intNumber;
//        System.out.println(longNumber);
//
//        // (4) int -> double 형 변환
//        intNumber = 200;
//        double doubleNumber = intNumber;
//        System.out.println(doubleNumber);

        // 작은 크기의 타입이 큰 크기의 타입과 "계산" 될 때,
        // 자동으로 큰 크기의 타입으로 형 변환이 됩니다.
        int intNumber = 10;
        double doubleNumber = 5.5;
        double result = intNumber + doubleNumber;

        System.out.println("Plus => " + result);

        // 1) 정수로 나누기
        int iResult = intNumber / 4 ; // 2.5

        // 2) 실수로 나누기
        double dResult = intNumber / 4.0;

        System.out.println(iResult + " / " + dResult);

        // 작은 타입 > 큰 타입 형변환시 ( 자동 형변환 )
        // - 더 큰 표현범위를 가진 타입으로 변환되는것이라 값의 손실이 없다
        // - 값의 손실없이 변환이 가능하기 때문에 컴파일러가 자동으로 형변환을 해준다.

        // 큰 타입 > 작은 타입 형변환시 (강제 형변환 = 캐스팅)
        // - 더 작은 표현범위를 가진 타입으로 변환되는것이라 값의 손실이 생긴다.
        // - 값의 손실이 생기기 때문에 자동으로 형변환을 해주지 않고 개발자가 선택하여 형변환을 한다.
        
        
        

형 변환에 대해서는 위에서 내가 했던 코드를 부분부분 잘라 터미널에서 실습을 하는것이 이해하는데에 더 큰 도움을 줄 것이다.

profile
안녕하세요.

0개의 댓글