[코드스테이츠 백엔드 44기 SEB BE] 5일차

오태호·2023년 2월 18일
0

코드스테이츠

목록 보기
5/22
post-thumbnail

Java

자바

  • 객체지향 프로그래밍(Object Oriented Programming, OOP) 언어
  • 운영체제에 독립적으로 실행 가능
  • 다양한 운영체제가 공존하는 웹 환경에 적합한 언어

자바의 특징

  1. 운영체제에 독립적
    • 자바 이전의 언어들은 특정 CPU에서만 작동하거나 특정 OS에 따라 다르게 작성해야 하는 언어들이 대부분이었음
    • 자바는 JRE(Java Runtime Environment)가 설치되어 있는 모든 운영체제에서 실행이 가능하도록 만들어짐
  2. 객체 지향 언어(Object Oriented Programming, OOP)
    • 모든 기능은 객체로 만들어 사용해야 함
    • OOP : 여러 객체들을 만들고 조립하여 하나의 프로그램을 실행하는 개념
    • 객체 지향적으로 설계된 프로그램은 유지보수가 쉽고 확장성이 높음
  3. 함수형 프로그래밍 지원
    • 자바 8버전부터 람다식 및 스트림이 추가됨
  4. 자동 메모리 관리(Garbage Collection)
    • Garbage Collector를 실행시켜 자동으로 사용하지 않는 메모리를 수거
    • 이를 통해 개발자는 메모리를 관리하는 수고를 덜고 핵심 코드에 집중할 수 있게 됨

JVM과 JDK

JVM(Java Virtual Machine)

  • 자바는 컴파일러를 통해 기계어로 변환되는 언어
  • 컴파일
    • 특정 프로그래밍 언어를 기계가 이해할 수 있는 언어로 번역하는 과정
    • 자바 언어를 JVM(Java Virtual Machine)이 이해할 수 있는 코드(Bytecode)로 변환하는 것
    • JVM은 Bytecode를 운영체제에 맞는 기계어로 변환
  • JVM
    • 자바 코드로 작성한 프로그램을 해석해 실행하는 별도의 프로그램
    • 자바가 운영체제에 독립적인 것은 JVM이 있기 때문에 가능
  • 프로그램이 제대로 실행되기 위해서는 다양한 컴퓨팅 자원(CPU, RAM, 입출력 장치 등)을 활용해야 함
    • 이런 자원을 운영체제가 관리해줌
      • 프로그램은 운영체제가 정한 규칙을 따라야만 함!
    • 서로 다른 운영체제에서 프로그램을 실행하기 위해서는 운영체제별 규칙을 따르는 별도의 절차가 필요 -> JVM이 이 문제를 해결해줌
  • JVM은 JDK나 JRE를 설치하면 자동으로 설치됨
    • JRE(Java Runtime Environment)
      • JVM + 표준 클래스 라이브러리
    • JDK(Java Development Kit)
      • JRE + 개발에 필요한 도구
  • 자바는 JVM을 거치므로 C나 C++에 비해 속도는 느린 편

Bytecode

  • 특정 하드웨어가 아닌 가상 컴퓨터에서 돌아가는 실행 프로그램을 위한 이진 표현법
  • 하드웨어가 아닌 소프트웨어에 의해 처리되므로 보통 기계어보다 더 추상적
  • 컴파일되어 만들어진 Bytecode는 특정 하드웨어의 기계 코드를 만드는 컴파일러의 입력으로 사용되거나, 가상 컴퓨터에서 바로 실행됨

JDK

  • 자바 프로그램을 개발하기 위한 핵심 플랫폼 구성요소
  • OracleJDK / OpenJDK 2가지 JDK가 있음

메서드

  • 함수
    • 특정 기능을 수행하는 코드들을 묶은 것
    • 특정 기능을 수행하기 위한 일련의 코드들의 집합체
  • 메서드
    • 클래스 내에 포함되어 있는 함수

메서드 정의

{반환 타입} {메서드 이름}({매개변수 타입} {매개변수 이름}) {
    메서드 바디
}
  • 반환 타입

    • 메서드는 처리 결과값을 반환하는데, 이를 반환값이라고 함
    • 값에는 종류가 나뉘어져 있음
      • 값의 유형 및 종류를 데이터 타입 또는 타입이라고 함
    • 반환 타입은 메서드가 반환할 반환값의 종류 및 유형을 의미
  • 매개변수 타입, 매개변수 이름

    • 매개변수
      • 메서드 외부로부터 전달받은 값을 저장하고 있는 변수
    • 매개변수는 메서드 외부에서 메서드 내부로 전달한 값을 할당받아 저장함으로써 메서드 내부에서 사용할 수 있게 해줌
    • 매개변수의 타입
      • 어떤 유형의 값을 메서드가 입력받을 것인지를 명시하는 것을 의미
    • 매개변수의 이름
      • 입력받은 값에 붙일 이름
  • 메서드 바디

    • 구체적으로 메서드가 어떤 기능을 수행할지에 대한 코드를 작성하는 부분
    • return 키워드를 사용해 어떤 값을 반환할 수 있음
      • 즉, return 키워드를 통해 메서드의 처리 결과값을 외부로 내보낼 수 있음

메서드 호출

  • 메서드는 정의하는 것만으로는 실행되지 않음
    • 어떤 메서드가 어떻게 동작해야 하는지만을 기술한 것
  • 메서드를 실행시키기 위해서는 메서드를 호출해야 함
{메서드 이름}()
  • 메서드 이름에 호출 연산자 ()를 붙여서 메서드 호출
    • 호출 연산자 () 안에는 매개변수에 넣어줄 값을 입력

main 메서드

public static void main(String[] args) {
    
}
  • 자바로 작성한 소스 코드 파일을 실행하면 가장 먼저 실행되는 메서드
    • 진입점 함수
      • 프로그램이 실행될 때 가장 먼저 실행되는 메서드 또는 함수
      • 자바에서 main 메서드는 진입점 함수
  • 자바로 소스 코드를 작성할 때에는 반드시 main 메서드가 있어야 하고 main 메서드로부터 코드의 흐름이 시작됨

변수(Variable)와 타입(Type)

  • 컴퓨터는 데이터를 다룰 때, 데이터를 메모리라는 곳에 임시로 기억해둠

  • 메모리에 값을 저장할 때의 과정

    1. 기억하고자 하는 값이 얼만큼의 메모리 공간을 필요로 하는지 파악
    2. 기억하고자 하는 값이 차지하는 용량만큼의 메모리 공간을 확보
    3. 값을 저장한 공간에 이름을 붙임
    4. 확보한 메모리 공간에 기억하고자 하는 값을 저장
    • 1번 과정

      • 어떤 값을 기억하기 위해서는 그 값을 저장하기 위해 필요한 메모리 공간의 크기를 알아야 함 -> 이를 위해 필요한 것이 타입
    • 타입

      • 데이터의 유형을 의미
      • 데이터의 유형별로 차지하는 메모리 공간의 크기가 각각 다름
    • 2, 3번 과정

      • 해당 값에 접근하기 위해 저장한 곳에 이름을 붙임
      • 변수 -> 어떤 값을 저장하고 나서 해당 값에 접근할 수 있도록 값이 저장된 메모리 공간에 이름을 붙인 것

변수

  • 값이 변할 수 있는 데이터를 임시적으로 저장하기 위한 수단
  • 값을 저장할 수 있는 메모리 공간을 확보하고, 사람이 식별할 수 있는 이름을 붙인 것
  • 어떤 데이터를 프로그래머가 원하는대로 처리하기 위해서는 그 데이터를 임시적으로 컴퓨터에 저장해둘 필요가 있음 -> 메모리(RAM)에 데이터를 저장

메모리

  • 1 byte 크기의 데이터를 저장할 수 있는 메모리 셀들이 모여 만들어짐
  • 각 메모리셀에는 고유 번호가 오름차순으로 매겨져 있음
  • 메모리 주소
    • 메모리셀에 붙여져있는 고유 번호

변수를 사용하는 이유

  • 값을 메모리에 넣기 위해서는 메모리 주소에 직접 값을 넣어줘야 할텐데 그렇다면 문제가 생김
  1. 저장해야 할 값이 많다면, 사람이 메모리 주소를 식별하기 어려움
  2. 시스템 운영에 꼭 필요한 데이터를 실수로 덮어쓸 가능성이 존재
  • 이러한 문제를 해결하기 위해 변수를 사용

변수 선언 및 할당

변수 선언

  • 변수를 사용하기 위해 우선 변수를 선언해야 함
  • 변수 선언 시에는 값의 데이터 타입과 함께 변수 이름을 작성
{데이터 타입} {변수 이름};
  • 변수 선언 시 내부적으로 발생하는 과정
    • 컴퓨터는 값을 저장할 메모리 공간을 데이터 타입을 보고 확보
    • 확보한 메모리 공간에 사용자가 입력한 변수 이름을 붙임

값 할당

  • 대입 연산자 =을 활용하여 변수에 값을 할당
int num;
num = 1; // 값 할당

대입 연산자

  • 어떤 값을 변수에 할당시켜주는 연산자
  • 좌항 = 우항; 과 같은 형식으로 사용
    • 좌항에는 변수, 우항에는 값이 위치함
    • 우항의 값이 좌항의 변수에 할당됨
  • 초기화
    • 변수를 선언하고 처음으로 값을 할당하는 것
    • 선언하면서 동시에 초기화도 가능
  • 재할당
    • 초기화가 이루어진 후에 다시 다른 값을 할당

변수 명명 규칙

  • 카멜 케이스(camelCase)를 사용한다
    • 두 번째 단어부터 대문자로 시작해 구분
char camelCase;
  • 변수명으로 영문자, 숫자, _, $을 사용할 수 있음
  • 대소문자를 구분함
  • 숫자로 시작하는 변수명은 사용할 수 없음
  • 자바에서 이미 사용중인 예약어는 변수명으로 사용할 수 없음

상수

  • 변하지 말아야 할 데이터를 임시적으로 저장하기 위한 수단
  • 재할당이 금지된 변수
    • 변수와 같이 선언하고 할당하여 사용할 수는 있지만, 재할당은 불가
  • final 키워드를 사용해 선언
    • 관례적으로 대문자에 _를 넣어 구분하는 SCREAMING_SNAKE_CASE를 사용

상수를 사용하는 이유

  1. 프로그램이 실행되면서 값이 변하면 안되는 경우
    • 상수로 선언함으로서 재할당 시에 에러가 발생하여 실수를 방지할 수 있음
  2. 코드 가독성을 높이고 싶은 경우
    • 저장하고 있는 상수명으로 값을 사용할 수 있기 때문에 코드 가독성이 향상됨
  3. 코드 유지관리를 쉽게 하고자 하는 경우
    • 상수값을 여러 곳에서 사용하는 경우, 일일이 수정해주지 않고 상수에 할당한 값만 수정해주면 됨

타입

타입이란?

  • 어떤 값의 유형 및 종류를 의미
  • 타입에 따라 값이 차지하는 메모리 공간의 크기와 값이 저장되는 방식이 결정됨

기본 타입과 참조 타입

  • 타입은 기본 타입(Primitive type) / 참조 타입(Reference type)으로 분류됨

기본 타입

  • 값을 저장할 때, 데이터의 실제 값이 저장됨
  • 정수 타입(byte, short, int, long), 실수 타입(float, double), 문자 타입(char), 논리 타입(boolean)
기본타입변수 = 100;
  • 100이라는 값 그 자체를 저장
    • 100은 정수형으로 데이터 타입 상으로 기본 타입에 해당함
  • 기본 타입은 값 그 자체가 변수에 저장되므로 출력을 하면 100이 그대로 출력됨

참조 타입

  • 값을 저장할 때, 데이터가 저장된 곳을 나타내는 주소값이 저장됨
  • 기본 타입 8개를 제외한 나머지 타입
참조타입변수 = 객체;
  • 변수에 객체를 저장
    • 저장하고자 하는 것이 존재하는 위치를 저장
    • 객체는 참조타입의 데이터에 해당됨
      • 어떤 변수에 객체를 저장한다면 그 변수에는 객체가 존재하는 메모리 주소를 값으로 가짐
  • 출력을 하면 객체의 주소값이 출력됨

리터럴

리터럴(Literal)이란?

  • 문자가 가리키는 값 그 자체를 의미
  • 리터럴은 변수 또는 상수에 할당할 수 있음
  • 리터럴 사용시에는
    1. float 타입의 변수에 실수형 리터럴을 할당할 때, 리터럴 뒤에 접미사 f를 붙여줌
    2. long 타입의 변수에 정수형 리터럴을 할당할 때, 리터럴 뒤에 접미사 L을 붙여줌

정수 타입

  • 숫자를 나타내는 타입
  • byte, short, int, long 총 4개의 타입으로 분류
    • 각각 차지하는 메모리 크기가 다름 -> 그렇기 때문에 나타낼 수 있는 숫자의 범위가 다름
타입메모리표현 범위
byte1 byte-128(27-2^7) ~ 127(272^7 - 1)
short2 byte-32,768(215-2^{15}) ~ 32,767(2152^{15} - 1)
int4 byte-2,147,483,648(231-2^{31}) ~ 2,147,483,647(2312^{31} - 1)
long8 byte-9,223,372,036,854,775,808(263-2^{63}) ~ 9,223,372,036,854,775,807(2632^{63} - 1)

정수형의 오버플로우, 언더플로우

  • 오버플로우
    • 어떤 값이 각 타입의 표현 범위의 최댓값을 넘어섬
  • 언더플로우
    • 어떤 값이 각 타입의 표현 범위의 최솟값을 넘어섬

오버플로우

  • 자료형이 표현할 수 있는 범위 중 최댓값 이상의 값을 표현한 경우 발생
  • 최댓값을 넘어가면 해당 데이터 타입의 최소값으로 값이 순환함

언더플로우

  • 자료형이 표현할 수 있는 범위 중 최솟값 이하의 값을 표현한 경우 발생
  • 최솟값을 넘어가면 해당 데이터 타입의 최댓값으로 값이 순환함

데이터 타입의 크기 및 표현 범위

  • byte -> short -> int -> long으로 갈수록 데이터 타입의 크기가 커지고 표현 범위도 켜짐

    • 데이터 타입의 크기가 데이터의 표현 범위를 결정한다!
  • 컴퓨터는 이진수로 데이터를 표현하는데, 이진수 한자리로는 0과 1만 표현할 수 있지만, 이진수의 자리수로르 늘려주면 더 많은 데이터를 표현할 수 있음

  • Ex. byte형

    • 1 byte의 크기를 가진 정수형 데이터 타입
    • 1 byte = 8 bit이므로 총 8자리의 이진수를 표현할 수 있음
    • 부호를 감안하지 않는다면 1byte로 282^8=256개의 숫자를 표현할 수 있음
    • 음수의 범위도 표현해야 함
      • 8 bit 중 맨 앞의 비트를 부호 비트로 사용
      • 맨 앞의 비트가 0이면 양수, 1이면 음수를 나타냄
      • 하나의 비트로 부호를 표현하니 남은 비트는 7bit이므로 총 272^7=128개의 숫자를 표현할 수 있음

실수 타입

  • 실수 : 소수점을 가지는 값
  • float형, double형으로 분류
타입메모리표현 범위정밀도
float4 byte음수 : -3.4 103810^{38} ~ -1.4 104510^{-45}
양수 : 1.4 104510^{-45} ~ 3.4 103810^{38}
7자리
double8 byte음수 : -1.8 1030810^{308} ~ -4.9 1032410^{-324}
양수 : 4.9 1032410^{-324} ~ 1.8 1030810^{308}
15자리
  • 컴퓨터에서 실수를 저장할 때는 부동소수점 표현 방식으로 저장
    • 효율적이지만 약간의 오차를 가짐
    • 오차는 실수를 더 정밀하게 표현할수록 줄어듬
    • 정밀도
      • 얼마나 실수를 정밀하게 나타낼 수 있는지
      • 데이터 타입의 크기가 클수록 높아짐

실수형의 오버플로우, 언더플로우

오버플로우

  • 값이 음의 최소 범위 또는 양의 최대 범위를 넘어갔을 때 발생
  • 값은 무한대가 됨

언더플로우

  • 값이 음의 최대 범위 또는 양의 최소 범위를 넘어갔을 때 발생
  • 값은 0이 됨

논리 타입

  • boolean형
    • 참 또는 거짓을 저장할 수 있는 데이터 타입
    • true 혹은 false 값을 가짐
    • 1 bit만 있으면 되지만 JVM이 다룰 수 있는 데이터의 최소 단위가 1 byte이므로 boolean형은 1 byte의 크기

문자 타입

  • char형

    • 2 byte 크기
  • 문자형 리터럴을 작성할 때에는 작은 따옴표('')를 사용

    • 큰 따옴표를 사용한 리터럴은 문자열 리터럴로 인식
  • 문자 타입의 리터럴은 변수에 어떻게 저장되는가?

    • 유니코드로 문자를 저장
    • 유니코드
      • 전 세계의 모든 문자를 컴퓨터에서 일관되게 다루기 위한 국제 표준
      • 각 문자에 숫자 코드 번호를 부여한 것
  • 숫자를 문자형 변수에 할당할 수 있음

    • 해당 숫자 그대로 저장되지만 변수의 값을 읽어올 때 해당 변수가 저장하고 있는 숫자값을 유니코드로 인식하여 해당 숫자와 일치하는 코드를 가진 문자로 변환됨

타입 변환

  • boolean을 제외한 기본 타입 7개는 서로 타입을 변환할 수 있음
  • 자동으로 변환되는 경우도 있고 수동으로 변환해야만 하는 경우도 있음

자동 타입 변환

  • 두 경우에는 타입이 자동으로 변환됨
    1. 바이트 크기가 작은 타입에서 큰 타입으로 변환할 때
    2. 덜 정밀한 타입에서 더 정밀한 타입으로 변환할 때(Ex. 정수 -> 실수)
  • 아래 순서도의 화살표는 화살표를 기준으로 좌측의 타입이 우측의 타입으로 자동으로 변환될 수 있음을 의미
byte(1) -> short(2)/char(2) -> int(4) -> long(8) -> float(4) -> double(8)
  • float은 4 byte이지만 int와 long보다 뒤에 있음
    • float이 표현할 수 있는 값이 모든 정수형보다 더 정밀하므로

수동 타입 변환

  • 차지하는 메모리 용량이 더 큰 타입에서 작은 타입으로는 자동으로 타입이 변환되지 않음
    • 캐스팅(casting)
      • 더 큰 데이터 타입을 작은 데이터 타입의 변수에 저장하기 위해서는 수동으로 타입을 변환해줘야 함
  • 캐스팅 연산자 () 를 사용하여 변환
    • 캐스팅 연산자의 괄호 안에 변환하고자 하는 타입을 적어줌
profile
자바, 웹 개발을 열심히 공부하고 있습니다!

0개의 댓글