JAVA 문법 (1)

김학산·2024년 11월 11일
post-thumbnail

1. 핵심 용어 정리

  • 데이터 : 컴퓨터가 정보를 담는 자료값

  • 데이터 타입(자료형) : 데이터의 유형 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()); //출력단에서의 언박싱

- 문자와 문자열

  • 선언 관점에서 차이점
    (1) 문자 (char)
    - 문자 한 개만 저장하며 따옴표를 사용하여 값을 지정합니다. (ex. ’A’)
          ```java
          char alphabet = 'A'; // 문자 하나를 저장합니다.
          ```
          
    (2) 문자열 (String)
    - 문자 여러 개를 문장 형태로 저장하며 쌍따옴표를 사용하여 범위를 지정합니다. (ex. “ABCDEFG”)
          ```java
          String message = "Hello World"; // 문자열을 저장합니다.
          ```
          
  • 저장 관점에서 차이점
    (1) 문자 (char)
    - 문자 뒤에 \0(널문자)가 없습니다.
    (1 byte만 쓰기 때문에 끝을 알아서 데이터만 저장하면 됩니다.)
    (2) 문자열 (String)
    - 문장의 끝에 \0(널문자)가 함께 저장이 됩니다.
    (몇 개의 byte를 쓸지 모르기 때문에 끝을 표시해야 합니다.)

- 참조형

  • stack의 경우에는 정적으로 할당된 메모리 영역입니다.

    • 그래서, 크기가 몇 byte 인지 정해져 있는 기본형 변수를 저장합니다.
    • 추가로, 크기가 정해져 있는 참조형 변수의 주솟값도 저장합니다.
  • Heap의 경우에는 동적으로 할당된 메모리 영역입니다.

    • 그래서, 크기가 계속 늘어날 수 있는 참조형 변수의 원본을 저장합니다.

2. JVM

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

  • JVM 놀이터의 구성도

3. JAVA로 프로그램 만들기

(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 경로를 추가해줍니다.

  • 새로 만들기를 클릭합니다.
  • 변수 이름에는 "JAVA_HOME"을 입력하고, 변수 값에는 JDK가 설치된 경로를 입력합니다.
    예를 들어, "C:\Program Files\Java`{JDK 설치경로}" 입니다.
    이제 Path 변수를 수정하기 위해 시스템 변수 목록 스크롤을 내려서 Path 변수 클릭 후 편집 버튼을 클릭합니다.
    편집 팝업이 뜨면 목록 맨위 항목을 클릭하고 텍스트 편집(T) 버튼을 클릭합니다.
    텍스트 편집 창이 뜨면 변수 값(V) 맨 앞에 %JAVA_HOME%bin; 문구를 추가해줍니다.
    이제 JDK가 설치되었는지 확인해봅시다.
    명령 프롬프트에서 "java -version"을 입력하면 JDK 버전이 출력됩니다.
    JDK 버전이 정상적으로 출력된다면 JDK 설치가 완료된 것 입니다.

(2) IntelliJ 설치
https://www.jetbrains.com/ko-kr/idea/download/
사이트에 접속하여 설치하면 됩니다.

(3) IntelliJ 실행
설치된 IntelliJ 을 실행하여 실습을 진행합니다.

4. 실습

// 클래스
// 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);
        

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

}

정수형과 실수형의 나누기를 통해 자동 형변환과 강제 형변환을 주석으로 표시하였습니다.

5. 마무리 문제

요리 레시피 메모장 만들기
입력값 :

내가 좋아하는 요리 제목을 먼저 입력합니다.
요리 별점을 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("맛있게 드시면 됩니다");

    }

}

출력결과 :

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

profile
반갑습니다.

0개의 댓글