자바란 무엇일까?(2024.04.03)

YJ·2024년 4월 3일
post-thumbnail

자바 기본

블로그 정리 팁

목표 > 공부한 내용 > 얻었고, 앞으로 이걸 해봐야지 적기

  • 프로젝트
    : 진행 상황, 이슈(오류, 안되는 + 내가 이 기능을 구현하고 싶은데 보기가 많은 경우) - 해결방안(선택 & 이유)

(we)b + log: 복붙

컴파일러와 인터프리터

우리는 다양한 언어를 사용하여 프로그램을 만든다.
이러한 언어들 가운데에도 언어를 번역하고 실행 시켜주는 두 가지
프로그램이 있었다.

영어를 못하는 사람이 영어책을 이해하기 위해서 두 가지 방법이 있다.

1. 통역이 가능한 사람이 옆에서 한줄 한줄 설명해주기.
2. 한글로 통번역된 책이 나오기까지 기다리기.

위 두 가지에는 장단점이 있는 것 같다.

통역이 가능한 사람이 옆에서 한줄 한줄 설명해주면
장점은 통번역이 나오기까지 기다려도 되지 않으므로 빠르게 내용을 이해할 수 있다.
단점은 하나하나 번역을 하고 이해를 해야하므로 책을 읽는 시간이 길어질 수 있다.

통번역된 책이 나온 후에 책을 읽는 것의
장점은 책이 나온 다음에는 바로 바로 이해하며 읽을 수 있으므로 책을 읽는 시간 자체는 짧아진다.
단점은 책이 나올때까지 오랫동안 기다려야 한다는 것이다.

위 예시는 컴파일러와 인터프리터를 이해하기 위한 것이다.

컴파일러 = 통번역 대기 후 읽기
인터프리터 = 옆에서 번역해주기

이런식으로 이해하였다.

컴파일러를 사용하는 언어로 된 프로그램을 빌드하는데까지의 컴파일 시간은 오래 걸리지만, 빌드가 된 후 런타임은 인터프리터보다 성능이 좋을 것이다.

인터프리터를 사용하는 언어로 된 프로그램을 빌드하는데는 조금의 시간 밖에 걸리지 않으나, 런타임에는 컴파일러로 빌드된 프로그램보다 성능이 낮을 것이다.

JVM

JVM은 여러 OS를 탑재한 컴퓨터에서 사용할 수 있도록, 컴파일된 파일을 실행하는 가상 환경

C 같은 언어는 운영체제에 맞는 실행 환경 에 맞게 각각 프로그램을 빌드해놔야 실행이 가능하다.

그러나, JAVA는 여러 운영체제 위에 JVM이라는 실행되는 공통된 환경 에 프로그램을 실행하기에 운영체제 마다 독립적으로 실행 환경을 구성할 필요가 없다.

자바 코드 맛보기


public class main() {
	public static void main(String[] args) {
    	System.out.printlb("Hello Java");
    }
}
  • { ... }
    중괄호로 구역을 나눈다.
  • public
    공공 장소의
  • static
    정적인 (프로그램이 실행되기 전에 준비된)
  • void
    아무것도 아닌것을 반환
  • main
    프로그램 시작할 때 호출되는 함수

자동 형변환 vs 수동 형변환

자동형변환
작은 자료형의 변수를 큰 자료형의 변수에 할당할때

byte a = 10;
int b = a;
System.out.println(b); // 10 출력

수동형변환
큰 자료형의 변수를 작은 자료형의 변수에 할당할때

int a = 128;
byte b = (byte)a;
System.out.println(b); // -128 출력

왜 -128이 출력될까?
byte의 범위는 -128 ~ 127 까지의 값이다.

오버플로우

byte는 8bit의 메모리 공간을 할당받은 변수이다.
위 예시 처럼 byte b = 128;
이런식으로 할당한다고 해보자.
128을 2진수로 나타내면 10000000 이다.

8bit를 할당받은 변수인데,,, 그러면 되야하는거 아닌가?

안되는 이유를 찾아보았다.

MSB가 원인이었다.
MSB는 부호를 나타내는 비트로써 비트의 맨 앞, 즉, 최상위 비트이다.

128은 2진수로 나타내면, 10000000이다.
즉, 맨 앞의 1이면 음수를 나타낸다는 것이다.

MSB를 사용하는 이유

사용하는 이유를 생각해보면, 2진수로 양수를 나타낼 수는 있지만,
음수를 나타낼 방법이 없다.
여기서 사용한 것이 MSB2의 보수 이다.
맨 앞의 부호가 1일 경우에는
음수이다.
그리고, 해당 값을 구하기 위해서는 2의 보수를 취해야 한다.
예를 들어 10000000 일 경우에는
1. 01111111
2. 01111111 + 1 => 10000000
이다. 이 말은 2의 보수를 취한 값이 음수의 절댓값이며,
즉 byte에서 10000000 일 경우에는 -128이라는 결과가 도출된다.

클래스 vs 객체

Q.
재용님이 삼송폰을 구매하셨습니다.
폰을 켰습니다.
띠로리
잡스님이 사과폰을 구매하셨습니다.
폰을 켰습니다.
@@@띠로롱@@@

여기서 객체를 찾아보자.
핸드폰, 사람

  • 클래스란
    제네시스가 가지고 싶다.

  • 클래스 종류
    객체를 만들기 위한 클래스
    = 라이브러리용 클래스
    실행용 클래스 : main

  • 클래스 구조
    접근제어자 class 클래스이름 {

    }

  • 자바의 접근제어자 종류
    public
    : 외부에서의 모든 접근이 허용된 접근 제어자

    protected
    : 같은 패키지에 속해 있을때만 호출이 가능한 접근 제어자
    예외적으로 다른 패키지에 있더라고 상속 관계에 있는 클래스라면 호출이 가능하다.

    default
    : 앞에 접근제한자를 붙이지 않았다면 기본적으로 적용되는 접근 제어자
    같은 패키지에 속해 있을 때만 호출이 가능하며 다른 패키지에서는 호출이 불가능해진다.

    private
    : 동일 패키지에서조차 접근이 불가능한 접근 제어자
    같은 클래스에서만 접근이 가능하다.

패키지 구조

중요하다...
면접에서 패키지로 털리는 이야기
이 부분은 Spring 프로젝트를 하면서 신경 써보자.

클래스 구성요소

1) 생성자
2) 변수

ex> 클래스: 책
1) 조립하는 방법
2) 부품
3) 완성품 기능 사용법

오늘은 다음과 같은 클래스를 설계하고 객체를 생성해보았다.

// 사람 클래스 및 객체 생성
public class EX06 {
	public void static main(String[] args) {
    	Person songa = new Person("송아", 20);
        Person kelly = new Person("켈리", 15);
        
        System.out.println(songa.name + songa.age);
        System.out.println(kelly.name + kelly.age);
    }
}

class Person {
	String name;
    int age;
    
    Person(String name, int age) {
    	this.name = name;
        this.age = age;
    }
}

// 노트북 클래스 및 객체 생성

public class EX07 {
	public void static main(String[] args) {
    	Notebook samsung = new Notebook("삼성");
        Notebook lg = new Notebook("LG");
        
        System.out.println(samsung.name);
        System.out.println(lg.name);
    }
}

class Notebook {
	String brandName;
    
    Notebook(String brandName){
    	this.brandName = brandName;
    }
}

클린코드 TIP
생성자의 매개변수 이름과 클래스의 멤버의 이름을 동일시하자.

profile
dev

0개의 댓글