[Java] 자바 문법 종합반 1주차

Yuri·2024년 12월 31일

Java

목록 보기
9/13
post-thumbnail

프로그래밍 언어

프로그래밍 언어(Programming Language): 사람과 컴퓨터간의 소통을 위한 방법(수단)
💻 컴퓨터는 0, 1만 이해한다 → 사람이 각종 연산과 작업을 부여하여 작업을 명령: 빅데이터, AI 등으로 활용되고 있다.

개발 언어의 역사

  • A언어 : 첫 개발 언어라는 의미에서 A Programming Language
    • 발표년대: 1960'
    • 핵심 기능 : 입/출력, 문맥
    • 프로그램을 만들기 위해 기본적으로 필요한 기능 입/출력, 문맥 기능만 구현 가능한 언어
  • B언어 : Bell 사에서 개발해서 B언어
    • 발표년대: 1960'
    • 핵심 기능 : A언어 기능 + 기계식 데이터 타입, 연산기능, 메서드
  • C언어 : B언어에 비해 더 좋은 언어라는 의미로 C언어
    • 발표년대: 1970'
    • 핵심 기능 : B언어 기능, 자료형 데이터 타입, 자료구조 (분류 등)
  • 자바 : 어디서나 동작 가능한, 자바 커피에서 이름을 따서 만든 Java 언어
    • 발표년대: 1990'
    • 핵심 기능 : C언어 기능 + 공통 실행환경(놀이터), 클래스, 객체
  • Java는 A언어의 기능 + B언어의 기능 + C언어의 기능Java 언어의 기능 을 추가한 언어

Java를 왜 배워야 하는가?

Java는 발전해 온 언어 중 가장 많이 쓰이는 개발 언어 중 하나

  1. 공통 실행환경이 있어서 여러 기기에서 실행 가능하다.
    • 여러 기기의 운영체제(OS)에서 실행할 수 있는 언어
    • 특히, 앱 개발에 적합하다.
  2. 세상과 닮아있는 개발 언어(객체 지향 언어)라 코드를 이해하기 쉽고 유지 보수가 쉽다.
    • 존재하는 물건을 "객체" 라고 부르는 세상을 닮도록 만든 객체 언어
      • 특징 (속성, 변수)
      • 행동 (메소드)
    • Java에서는 클래스를 통해 객체를 만든다.
  3. 안정성이 높아서 프로그래밍 오류를 방지하고 보안상 안전하다.
    • Java 언어로 작성된 문맥을 바이트 코드로 변환하는 변환기(Compiler)가 먼저 오류를 체크한다. → 컴파일 오류로 미리 에러 체크
    • Java에서 지원하는 보안 기술이 많이 있다.
  4. 대규모 앱 개발이 가능하다.
    • 네트워크 및 데이터베이스 연결 및 통신 등의 작업을 처리하는 API 제공
  5. 다양한 개발 도구라이브러리를 사용할 수 있다.
    • 앱 개발에 필요한 작업을 보다 쉽게 처리

JVM

  • Java Virtual Machine의 약자로 "자바 가상 머신"이라는 뜻을 가지고 있다.
    • 가상 머신이란 가상의 기기를 만들어주는 것을 의미한다.
    • 여러 가지 기기 위에 Java 프로그램을 실행시킬 수 있는 가상의 기기를 만들어 주는 것을 의미

바이트 코드

  • 내가 작성한 코드가 운영체제가 읽을 수 있는 코드(바이트 코드)로 Java 컴파일러가 변환한 코드

    💡 Java 컴파일러란?
    내가 작성한 Java 코드들(.java)을 운영체제가 읽을 수 있는 바이트 코드(.class)로 변환하는 변환기

JVM 동작 흐름

JDK (Java Development Kit)

📌 JDK의 Jdb 기능을 통해서 실행 중인 프로그램의 코드 실행을 따라다니며 볼 수 있습니다.
👀 디버깅 = 중단점 일시정지 + 코드 라인 단위 수행

첫번째 프로젝트 실행

public class Main {

    // [JDK]
    // 1. Compiler : .java -> .class
    // 2. JRE
    // 3. JDB : 디버깅
	
    // main 메소드
    // 자바 프로젝트(앱)는, 제일 먼저 클래스의 main 메소드를 실행시킨다.
    // = JVM의 약속
    public static void main(String[] args) {
        System.out.println("Our First Project! :)");
    }
}

클래스 : .class 관리 단위
public : (접근)제어자, public(공공의, 공통의)
input → system → output : 타입을 제한하고 있다
void : "아무것도 없다"
주석 : description

public class Main {
	// 1. 7 출력
    // 2. 3 출력
    // 3. 3.14 출력
    // 4. JAVA 출력
    public static void main(String[] args) {
        System.out.println(7);
        System.out.println(3);
        System.out.println(3.14);
        System.out.println("JAVA");
    }
}

변수

변하는 것(변수)과 변하지 않는 것(상수)

▶︎ 변수 : 변하는 저장 공간 🍽️

  • 저장공간의 선언
// int: 저장공간의 타입, number: 저장공간의 이름
// number 라는 이름의 int 타입의 저장공간을 선언
int number;
  • 값의 저장
    1. 값의 선언과 동시에 값을 저장 (초기화)

      int number = 10;
    2. 선언 이후에 값을 저장

      int number;
      number = 10;

▶︎ 상수 : 변하지 않는 저장 공간 🥘

final int number = 10;

기본형과 참조형

  1. 기본형
  • 논리형 변수 : boolean
  • 문자형 변수 : char
  • 정수형 변수 : byte, short[2byte], int[4byte], long(L)[8byte]
  • 실수형 변수 : float(f)[4byte], double[8byte]

float는 4byte만 쓰는데 어떻게 long 보다 더 넓은 범위를 표현 가능한가요?
float라는 단어의 뜻은 “부동”이라는 의미를 가지고 있으며 소수점이 움직인다는 의미의 “부동 소수점 방식”으로 숫자를 저장합니다.

  • 부동 소수점 방식 : 가수와 지수를 구분해서 저장하고 이 값들을 곱한 값을 저장(표현) 하는 방식입니다.
  1. 참조형 (주소값을 가지고 있음)
  • 문자열 변수 : String
    • "Apple", "텍스트"와 같은 문장을 저장합니다.
  • 그 외: Object, Array, List ...
    • 객체, 배열, 리스트와 같은 단일 저장공간에 담을 수 없는 값을 저장합니다.

래퍼 클래스(Wrapper Class)

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

  • 박싱(Boxing) vs 언박싱(Unboxing)
// 박싱 VS 언박싱

// 박싱
// Integer 래퍼 클래스 num 에 21 의 값을 저장
int number = 21;
Integer num = new Integer(number); // deprecated : 더 이상 사용하지 않음

Integer num = number; // 사실, 따로 Boxing 하지 않아도 자동 형변환 된다!

// 언박싱
int n = num.intValue(); // 래퍼 클래스들은 intValue() 같은 언박싱 메서드들을 제공해줍니다.

n = num; // 사실, Unboxing 도 마찬가지로 하지 않아도 형변환된다.
  • 실습한 int, Integer 외에도 모든 기본 타입에는 래퍼 클래스가 있습니다.
기본 타입래퍼 클래스
byteByte
shortShort
intInteger
longLong
floatFloat
doubleDouble
charCharacter
booleanBoolean

왜, 굳이 래퍼 클래스를 사용하는 건가요?
클래스는 객체지향 언어인 Java의 핵심 기능. 때문에 클래스로 변수를 관리하면 객체 지향의 많은 기능을 사용할 수 있게 됩니다! 👍

숫자와 문자 (ASCII 코드)

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); // 아스키코드에 따라 변환된 문자 출력
    }
}

문자와 문자열

  • 선언 관점에서 차이점
    • 문자 (char)
      • 문자 한 개만 저장하며 따옴표를 사용하여 값을 지정합니다. (ex. ’A’)
        char alphabet = 'A'; // 문자 하나를 저장합니다.
    • 문자열 (String)
      • 문자 여러 개를 문장 형태로 저장하며 쌍따옴표를 사용하여 범위를 지정합니다. (ex. “ABCDEFG”)
        String message = "Hello World"; // 문자열을 저장합니다.
  • 저장 관점에서 차이점
    • 문자 (char)
      • 문자 뒤에 \0(널문자)가 없습니다.
        (1 byte만 쓰기 때문에 끝을 알아서 데이터만 저장하면 됩니다.)
    • 문자열 (String)
      • 문장의 끝에 \0(널문자)가 함께 저장이 됩니다.
        (몇 개의 byte를 쓸지 모르기 때문에 끝을 표시해야 합니다.)
  • 참조형
    • 참조형 변수 = 주소형 변수?
      • 다른 기본형 변수가 실제 값을 저장하는 저장 공간이라면
        참조형 변수는 실제 값이 아닌 원본 값의 주솟값을 저장합니다.
      • 다시 말해 참조형 변수는 주솟값을 저장하는 주소형 변수라고 불러도 됩니다.
    • 저장 관점에서 차이점
      • 기본형 변수 : 원본 값이 Stack 영역에 있습니다.
      • 참조형 변수 : 원본 값이 Heap 영역에 있습니다.
        • Stack 영역에는 따로 저장 해둔 원본 값의 Heap 영역 주소를 저장합니다.

📌 Stack 영역 vs Heap 영역

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

비트 & 바이트

  • Byte = 8 Bit
    • 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) {
        double doubleNumber = 10.1010;
        float floatNumber = 10.1010f;
        
        int intNumber;
        intNumber = (int) doubleNumber;
        System.out.println("double Type => " + doubleNumber);
        System.out.println("int Type => " + intNumber);

        intNumber = (int) floatNumber;
        System.out.println("float Type => " + floatNumber);
        System.out.println("int Type => " + intNumber);
        
    }
}
  • 정수 → 실수 변환 (명시적 변환)
public class Main {

    public static void main(String[] args) {
        int intNumber = 10;

        double doubleNumber = (double) intNumber;
        float floatNumber = (float) intNumber;

        System.out.println("int Type =>  " + intNumber);
        System.out.println("double Type => " + doubleNumber);
        System.out.println("float Type => " + floatNumber);
        
    }
}

자동 형변환

  • 1) 자동 타입 변환은 작은 크기의 타입에서 큰 크기의 타입으로 저장될 때 큰 크기로 형변환이 발생합니다.

    📌 변수 타입별 크기 순서
    byte(1) → short(2) → int(4) → long(8) → float(4) → double(8)

큰 크기의 타입에 작은 크기의 타입을 할당하면 자동 형변환이 발생한다.

public class Main {

    public static void main(String[] args) {
        int intNumber = 10;
        double doubleNumber = intNumber;
        System.out.println("double Type => " + doubleNumber);
    }
}
  • 2) 작은 크기의 타입이 큰 크기의 타입과 계산될 때 자동으로 큰 크기의 타입으로 형변환이 발생합니다.
public class Main {

    public static void main(String[] args) {
        int intNumber = 10;
        double doubleNumber = 5.5;
        System.out.println("result => " + (intNumber + doubleNumber));
    }
}

과제

요리 레시피 메모장 만들기

  • 입력값
  1. 내가 좋아하는 요리 제목을 먼저 입력합니다.
  2. 요리 별점을 1~5 사이의 소수점이 있는 실수로 입력해 주세요. (ex. 3.5)
  3. 이어서 내가 좋아하는 요리 레시피를 한 문장씩 10문장을 입력합니다.
  • 출력값
    - 입력이 종료되면 요리 제목을 괄호로 감싸서 먼저 출력해 줍니다.
    - 이어서, 요리 별점을 소수점을 제외한 정수로만 출력해 줍니다. (ex. 3)
    - 바로 뒤에 정수 별점을 5점 만점 퍼센트로 표현했을 때 값을 실수로 출력해 줍니다. (ex. 60.0%)
    - 이어서, 입력한 모든 문장 앞에 번호를 붙여서 모두 출력해 줍니다.
import java.util.Scanner;

public class RecipeMemo {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        /* 입력 */
        String title = sc.nextLine();
        double score = sc.nextDouble();
        sc.nextLine();
        String[] recipes = new String[10];
        for (int i = 0; i < recipes.length; i++) {
            recipes[i] = sc.nextLine();
        }
        sc.close();

        /* 출력 */
        System.out.println("["+title+"]");
        System.out.println("별점 : " + score + " (" + (score * 20) + "%)");
        for (int i = 0; i < recipes.length; i++) {
            System.out.println((i+1)+". " + recipes[i]);
        }
    }
}

profile
안녕하세요 :)

0개의 댓글