[자바] 그냥 정리 ㅋㅋ

박준수·2022년 10월 22일
0

자바 기본 개념

목록 보기
1/4
post-thumbnail

> 자바 언어의 특징

  • 플랫폼 독립성
    자바는 하드웨어, 운영체제 등 플랫폼에 종속되지 않는 독립적인 바이트 코드로 컴파일되며 자바 가상 기계만 있으면 하드웨어/운영체제를 막론하고 자바 프로그램의 실행이 가능하다.(WORA = Write Once Run Anywhere)

  • 객체 지향
    자바는 객체지향언어로서 캡슐화, 상속, 다형성을 지원한다.

  • 클래스로 캡슐화
    자바는 객체 지향 언어의 캡슐화 원칙을 철저히 지켜, 변수나, 메소드는 반드시 클래스 내에 구현한다. 자바는 클래스 안에 새로운 클래스, 즉 내부 클래스를 만들 수 있다.

  • 소스와 클래스 파일

클래스 파일(.class)에는 반드시 하나의 자바 클래스만 들어있다. 그러므로 하나의 자바 소스 파일에 여러 개의 클래스를 작성한 경우, 컴파일하면 클래스마다 별도의 클래스 파일이 생성된다.
public 클래스는 하나만 가능, 소스 파일의 이름과 public 선언된 클래스 이름은 같아야 함

  • 실행코드 배포
    자바 응용프로그램은 한 개의 클래스 파일 도느 다수의 클래스 파일로 구성된다. 다수의 클래스 파일을 jar 파일 형태로 압축하여 배포하거나 실행할 수 있다. java9부터는 자바 응용프로그램을 위한 맞춤형 커스텀 JRE을 만ㄷ르어 실행시킬 수도 있다.

  • 패키지
    서로 관련 잇는 클래스는 패키지로 묶어 관리한다.
    ex) java.lang.System => java\lang(패키지) 폴더의 System.class 파일

  • 멀티 스레드
    하나의 자바 프로그램이 다수의 작업을 처리할 수 있도록 다수의 스레드가 동시에 실행할 수 있는 환경을 지원한다. 보통 멀티스레드 프로그램을 작성하기 위해서는, 운영체제가 멀티스레드를 지원하고 멀티스레드와 관련된 API나 라이브러리를 제공해야만 하지만 자바는 멀티스레드 프로그램이 가능하기 때문에 멀티스레드를 지원하지 않는 운영체제에서도 자바를 이용히면 멀티스레드 프로그램을 개발할 수 있다.

  • 가비지 컬렉션
    사용되지 않는 메모리(가비지) 자동 회수

  • 실시간 응용 시스템에 부적합
    자바 응용프로그램은 실행 도중 예측할 수 없는 시점에 가비지 컬렉션이 실행되므로, 프로그램 실행이 일시적으로 중단된다. 이런 문제로 실시간 시스템에는 자바 언어가 부적합

  • 자바 프로그램은 안전하다, 프로그램 작성이 쉽다.
    포인터 개념 X, 다양한 라이브러리, 강력한 GUI라이브러리 지원

  • 실행 속도를 개선하기 위해 JIT 컴파일러가 사용
    자바는 자가 가상 기계가 인터프리터 방식으로 바이트 코드를 실행하므로 C/C++보다 실행이 느리다고 알려져 있지만, 실행하는 도중 자바 프로그램을 CPU의 기계어 코드로 컴파일하고 CPU가 바로 기계어를 실행하도록 하는 JIT(Just In Time) 컴파일링 기법을 이용.

> JDK와 JRE

JDK는 자바 프로그램을 만드는데 필요한 도구들(자바 컴파일러 등의 개발 도구 + JRE)
JRE는 자바 응용프로그램이 실행될 때 필요한 소프트웨어들로 개발자가 활용할 수 있는 자바 API(이미 컴파일된 다양한 클래스 라이브러리) + JVM

bin 디렉토리 : 자바 개발, 실행에 필요한 도구와 유틸리티 명령

  • javac: 자바 컴파일러로 자바 소스를 바이트 코드로 변환
  • java: 자바 프로그램 실행기. 자바 가상 기계를 작동시켜자바 프로그램 실행
  • javadoc: 자바 소스로부터 HTML 형식의 API 도큐먼트 생성
  • jar: 자바 클래스 파일을 압축한 자바 아카이브 파일(.jar)생성 ,관리
  • jmod: 자바의 모듈 파일(.jmod)을 만들거나 모듈 파일의 내용 출력
  • jlink: 응용프로그램에 맞춘 맞춤형(custom) JRE 제공
  • jdb : 자바 응용프로그램의 실행 중 오류를 찾는데 사용하는 디버거
  • javap: 클래스 파일의 바이트코드를 소스와 함게 보여주는 디어셈블러

> C/C++와 java의 실행과정 차이

C/C++실행과정 : C/C++소스프로그램을 컴파일하여 목적파일(.obj)를 생성하고, 링크 과정을 통해 목적파일들을 연결하여 하나의 실행파일(.exe)을 만든다. 링크과정에서는 프로그램에서 호출한 C/C++라이브러리 함수들을 찾고 이 함수들의 목적 코드를 라이브러리 파일에서 꺼내 .exe파일에 삽입

자바의 실행과정: 여러 소스 파일(.java)로 나누어 작성하며, 자바 컴파일러는 각 소스 파일을 컴파일하여 클래스 파일(.class)을 생성한다. 개발자는 여러 클래스 파일 중 하나를 지정하여 실행하면, 자바 가상기계는 그 클래스 파일을 메모리에 로딩하고 실행시킨다. 실행 도중 다른 클래스 파일이나 자바 API의 클래스 파일이 필요하면, 자바 가상 기계는 그 때 그 클래스 파일을 로딩(동적)하고 실행한다. 이런 방식이면 처음부터 모든 클래스 파일을 로딩해놓을 필요 없이 당장 실행할 클래스 파일만 로딩하여 실행.

> 바이트코드와 바이너리코드의 차이점

C/C++ 소스 프로그램을 컴파일하여 생긴 목적파일은 바이너리 코드의 형태이지만 실행될 수 없다.
그래서 링크 과정을 통해 생성된 실행파일(.exe)로 변환할때 컴퓨터가 바로 실행될 수 있는 기계어가 될 수 있다.
CPU가 이해할 수 있는 언어가 바이너리 코드라면 바이트 코드는 가상 머신이 이해할 수 언어이다.
고급언어로 작성된 소스코드를 가상 머신이 이해할 수 있는 중간 코드로 컴파일한 것을 말한다.
바이트 코드는 다시 실시간 번역기 또는 저스트 인 타임(just-in-time, JIT) 컴파일러에 의해 바이너리 코드로 변환된다.

> 자바 식별자 이름 규칙

  • 특수문자(%,*, &, @, ^등), 공백(탭, space등)은 식별자로 사용할 수 없으나, '_', '$'는 예외로 사용할 수 있다.
  • 한글도 식별자로 사용 가능하다.
  • if, while, class등 자바 언어의 키워드는 식별자로 사용할 수없다.
  • 식별자의 첫 번째 문자로 숫자는 사용할 수 없다.
  • true, false, null은 자바의 키워드이므로 식별자로 사용할 수 없다.
  • '_', '$'는 식별자의 첫 번째 문자로 사용할 수 있으나, 일반적으로 잘 사용하지 않는다.
  • 대소문자를 구별한다.
  • 길이 제한이 없다.

> 자바의 데이터 타입

  • 기본타입
    • boolean 1비트
    • char 2바이트
    • byte 1바이트
    • short 2바이트
    • int 4바이트
    • long 8바이트
    • float 4바이트
    • double 8바이트
  • 레퍼런스 타입
    • 배열에 대한 레퍼런스
    • 클래스(class)에 대한 레퍼런스
    • 인터페이스(interface)에 대한 레퍼런스

자바 10부터 지역 변수를 선언할 대 변수의 타입 대신 var 키워드를 사용할 수 있다.

ex)
var price 200;
var name = "junsu";
var pi = 3.14;
var point = new Point();
변수 선언문에 초깃값이 주어지지 않으면 오류 발생

> 좋은 이름 붙이는 관습

  1. 목적에 맞는 이름을 붙이는 것이 좋다. 합을 저장하는 변수 => sum
    프로그램을 읽기 쉽게 만든다.

  2. 충분히 긴 이름으로 붙이는 것이 좋다. AVM => AutoVendingMachine
    충분히 긴 이름은 주석문의 기능을 가진다.

  3. 언어의 관습
    autovendingmachine , autovending_machine => AutoVendingMachine

  4. 클래스의 이름의 첫 번쨰 문자는 대문자!
    public class Hello

  5. 변수, 메소드 이름의 첫 단어는 소문자 이후 각 단어의 첫 번째 문자만 대문자로 표기
    int myAge;
    boolean isSingle;

  6. 상수 이름은 전체를 대문자로
    final double PI = 3.141592;

> 강제 타입 변환

int n = 300;

byte(0~256) b = n;// 컴파일 오류, 큰 범위의 데이터를 작은 범의의 데이터타입으로 바뀌면 오류 발생

byte b = (byte)n // 그래도 바꾸고싶다면 강제 형변환 그러나 범위를 뺸 나머지가 저장 300-256=>44

> 표준입력스트림객체

System.in: 키보드 장치를 직접 제어하고 키 입력을 받는 표준 입력 스트림 객체이다. 카 값을 바이트로 리턴
Scanner 객체 : System.in 객체를 이용하여 키보드로부터 일련의 바이트 정보들을 입력받고, 이 바이트들은 정수, 실수, 문자, 문자열 등 자바 응용프로그램이 원하는 타입으로 변환하여 리턴한다.

> nextLine() vs next()

nextLine() : 공백이 낀 문자열을 입력받기 위해서 사용

  • enter만 입력했을 때 빈 문자열 리턴

next() : 공백이 낀 문자열을 읽을 수 없음

  • enter만 입력했을 떄 문자열이나 숫자등 다른 키가 입력될때까지 기다림 절대 빈문자열을 리턴하지않음

> 배열

: 인덱스와 인덱스에 대응하는 데이터들로 이루어진 연속 자료 구조로서, 같은 종류의 데이터들이 순차적으로 저장된다.

배열 생성

  • 배열에 대한 레퍼런스 변수 선언 => int intarray [];
  • 배열 생성 - 배열의 저장 공간 할당 => intarray = new int [5];

string 배열을 for each문을 통해 출력 예

String names[] = { "사과", "배", "바나나", "체리", "딸기", "포토" };
for(String s : names) {
	System.out.print(s + " ");
}

2차원 배열

  • 정방형 : int intArray[][] = new int [2][5]; // 2행 5열
  • 비정방형 : int intArray[][] = new int[4][];
    intArray[0] = new int[3];
    intArray[1] = new int[2];
    intArray[2] = new int[3];
    intArray[3] = new int[2];

> Main() 메소드의 특징

  • 자바 응용프로그램의 실행은 main() 메소드부터 시작한다.
  • main() 메소드는 public 속성이다. (자바 응용프로그램이 실행을 시작할 때 JVM에 의해 호출되어야하므로)
  • main() 메소드는 static 속성이다. (main()메소드는 자신을 포함하는 클래스의 객체가 생성되기 전에 처음부터 JVM에 의해 호출되므로)
  • main() 메소드의 리턴 타입은 void이다. (아무 값도 리턴하지 않기 떄문에 void 타입이다.)
  • main() 메소드에는 문자열 배열(String [])이 매개변수로 전달된다.

> 예외(Exception)와 에러(Error)

Error : 문법에 맞지 않게 작성된 코드는 사전에 컴파일러에 의해 컴파일 오류(Error)로 걸러진다.(무한루프, 스택오버플로 등 어디서 발생할지 예측할 수 없고 강제 프로그램 종료시키지 않으면 멈출 수 없는 경우)
Exception : 사용자의 잘못된 입력이나 배열의 인덱스가 배열의 크기를 넘어가는 등 , 예기치 못한 상황에 의해 프로그램 실행 중에 발생한다.
예외란 사용자 프로그램에서 try-catch 블록을 이용하여 제어할 수 있는 실행 시간 오류다. 예외 상황들이 발생하였을 때는 try-catch블록을 이용하여 문제를 바로잡아 실행되게 할 수 있다. (제어 가능

> try catch finally문

예외가 발생할 가능성이 있는 실행문들을 tryr{} 블록으로 묶고, 예외 처리 코드는 catch{}블록 내에 작성한다. catch()문의 ()안에는 처리하고자 하는 예외의 타입을 선언한다. finally 블록은 예외가 발생하든 않든 마지막에 반드시 실행한다.

> 예외 클래스

> 객체 지향 언어의 특성

  • 캡슐화 : 객체를 캡슐로 싸서 내부를 보호하고 볼 수 없게 하는 것(은닉화)
    클래스를 통해 캡슐화를 구현
class Animal{
	String name;
    int age;
    void eat(){}
    void speak(){}
 }
  • 상속 : 서브클래스가 슈퍼클래스의 속성을 물려받고 기능을 추가하여 확장하는 것
class Human extends Animal {
	String hobby;
    String job;
    void work(){};
 }
  • 다형성: 같은 이름의 메소드가 클래스 혹은 객체에 따라 다르게 동작하도록 구현되는 것

    • 오버로딩: 클래스 내에서 이름이 같지만 서로 다르게 동작하는 메소드
    • 오버라이딩: 슈퍼클래스에 구현된 메소드를, 서브 클래스에서 동일한 이름으로 자신의 특징에 맞게 다시 구현하는 메소드

> 객체지향과 절차지향 프로그래밍의 차이

절차지향 프로그래밍은 흐름도에 따라 일련의 동작들이 순서대로 실행되도록 작성한다.
객체지향 프로그래밍은 객체들을 실세계의 물체에 가깝게 모델링하여 객체들의 관계, 상호작용으로 설계한다.

> 클래스, 객체, 생성자

클래스 : 객체를 만들어 내기 위한 설계도 혹은 틀
객체 : 클래스 모양 그대로 생성된 실체
생성자 : 객체가 생성될 때 객체를 초기화를 위해 실행되는 메소드

  • 생성자가 하나도 없는 경우, 컴파일러는 기본 생성자를 자동으로 생성, 그러나 매개변수가 잇는 생성자가 작성되어 있따면 컴파일러는 기본 생성자를 만들어 주지 않음.
    (서브 클래스의 성성자에서 슈퍼 클래스의 생성자를 명시적으로 선택한는 것이 원칙인데 슈퍼 클래스의 기본생성자가 없다면 오류가 발생)

> 객체 배열 선언과 생성 과정

객체배열 : 객체에 대한 레퍼런스를 원소로 갖는 배열

  • 배열에 대한 레퍼런스 선언
    Circle [] c;
    // 레퍼런스 변수 c만 선언할 뿐 배열을 생성하는 것이 아님

  • 레퍼런스 배열 생성
    c = new Circle[5];
    //Circle 객체에 대한 레퍼런스 5개 생성//Circle 객체들은 아직 존재 X

  • 객체 생성
    for(int I = 0; I <c.length; I++)
    c[I] = new Circle(I);
    // Circle 객체를 하나씩 생성하여 배열 c[]의 각 레퍼런스에 대입

> this

this는 객체 자신에 대한 레퍼런스이다.
this는 메소드에서 사용되며 현재 객체를 가르킨다.
this는 static 메소드에서는 사용할 수 없다.

언제 사용하는가?

  1. 클래스의 멤버변수 이름과 생성자의 매개변수이름이 같을 때 클래스의 멤버변수 앞에 this.멤버변수처럼 사용
  2. 메소드가 객체 자신의 레퍼런스를 리턴해야 하는 경우

> this()

this()는 클래스 내에서 생성자가 다른 생성자를 호출할 때 사용하는 자바 코드이다.

  • this()는 반드시 생성자 코드에서만 호출할 수 있다.
  • this()는 반드시 같은 클래스 내 다른 생성자를 호출할 때 사용된다.
  • this()는 반드시 생성자의 첫 번째 문장이 되어야 한다.

> super와 super()

super : 현재 객체 내에 있는 슈퍼 클래스 멤버를 접근할 수 있다.
ex) super.객체 내의 슈퍼클래스의 멤버

super() : 서브 클래스의 생성자에서 슈퍼 클래스의 생성자를 호출할 때 사용한다.(컴파일러가 자동으로 슈퍼 클래스의 기본 생성자를 호출하기에 명시적으로 슈퍼 클래스의 생성자를 선택하기 위해) 첫줄에 와야함


> 객체의 인자 전달 방식

  • 기본 타입의 값이 전달되는 경우

    • 매개변수가 byte, int, double 등 기본 타입의 값일 때
    • 호출자가 건네는 값이 매개변수에 복사되어 전달. 실인자 값은 변경되지 않음
  • 객체가 전달되는 경우

    • 객체 레퍼런스 값이 전달된다.
    • pizza변수에 저장된 값(레퍼런스)이 m에 복사되어 m은 피자가 가리키는 객체를 함께 가리키게 된다.
  • 배열이 전달되는 경우

    • 객체가 전달되는 경우와 마찬가지로 배열에 대한 레퍼런스만 전달된다.

자바의 인저 전달방식 : 자바는 Call by reference가 없다.

> 가비지, 가비지 컬렉션 , 컬렉터

가비지 : 자바 응용프로그램에서 더 이상 사용되지 않게 된 객체나 배열 메모리
ex)
a = new person("이몽룡");
b = new person("성춘향");
b = a; // b가 가리키던 처음 객체는 아무도 참조하지 않게 되어 더 이상 접근 X
Garbage Collection, 줄여서 약어로 GC라고도 부른다. 영어로 그대로 읽어서 가비지 컬렉션이라고 부른다. 메모리 관리 방법 중에 하나로, 시스템에서 더 이상 사용하지 않는 동적 할당된 메모리 블럭을 찾아 자동으로 다시 사용 가능한 자원으로 회수하는 것으로 시스템에서 가비지컬렉션을 수행하는 부분을 가비지 컬렉터라 부른다.
가비지 컬렉터는 가비지 컬렉션을 수행하는 도구..?

가비지 컬렉션은 가비지 컬렉션 스레드에의해 처리된다.

> 멤버 접근 지정자

non-static멤버와 static 멤버 차이

공유 멤버를 만들고자 할 때 static키워드 사용

static멤버 접근 방법

  • 객체 or 클래스명.static필드 or static메소드

static 메소드의 조건

1) static 메소드는 객체 없이도 존재하기 때문에 this를 사용할 수 없다.

2) static 메소드는 static 멤버만 접근할 수 있다.

  • static 메소드는, 객체 없이도 존재하기 때문에, 객체와 함께 생성되는 non-static멤버를 사용할 수 없고, static 멤버들만 사용가능하다. 반면 non-static 메소드는 static멤버들을 사용할 수 있다.

> final 키워드

final class => 클래스를 상속받을 수 없음
final 메소드 => 오버라이딩할 수 없음
final 필드 => 상수(변경할 수 없음)

상수 필드에 public static 과 함께 선언하면, 프로그램 전체에서 사용할 수 있는 상수

> 업캐스팅과 다운캐스팅

업캐스팅 : 서브 클래스의 객체에 대한 레퍼런스를 슈퍼 클래스 타입으로 변환하는 것
Person p;
Student s = new Student();
p = s; // 업캐스팅

업캐스팅한 레퍼런스로는 슈퍼 클래스의 멤버만 접근할 수 있다.
(Person)s 와 같이 명시적 타입 변환을 하지 않아도 된다. Student 객체는 Person 타입이기도 하기 때문이다.

다운캐스팅 : 슈퍼 클래스의 객체에 대한 레퍼런스를 서브 클래스 타입으로 변환하는 것
Person p = new Student("이재문'); // 업캐스팅
Student s = (Student)p; //다운 캐스팅 // 명시적으로 타입 변환을 지정해야함

> 다형성

다형성이란 ‘하나의 인터페이스(같은 이름)에 서로 다른 내용 구현’이라는 객체 지향의 특성이다. 다형성에는 메소드 오버라이딩, 메소드 오버로딩이 있다. 오버라이딩은 슈퍼 클래스에 선언된 메소드를, 각 서브 클래스들이 자신만의 내용으로 새로 구현하는 기능이다. 이때 업캐스팅을 하고 메소드를 호출하면 서브 클래스의 메소드가 실행이 된다. 이것이 동적 바인딩인데 동적바인딩은 실행할 메소드를 컴파일(compile time) 시에 결정하지 않고 실행시(run time)에 결정하는 것을 말한다. 메소드 오버로딩은 같은 클래스나 상속 관계에서 동일한 이름의 메소드 중복 작성하는 것인데 사용의 편리성을 향상시킴으로서 다형성을 실현시킨다.(매개 변수의 타입이나 개수가 달라야 성립)

오버라이딩

  • 슈퍼 클래스의 메소드와 동일한 원형으로 작성한다.
  • 슈퍼클래스 메소드의 접근 지정자보다 접근의 범위를 좁여 오버라이딩 할 수 없다.
  • static이나 private 또는 final로 선언된 메소드는 서브 클래스에서 오버라이딩 할 수 없다.

오버라이딩은 동적 바인딩을 유발시킨다.

그렇다면 슈퍼 클래스의 메소드는 이제 더 이상 실행하는 방법은 없는가? 아니다. super 키워드를 이용하면 정적 바인딩을 통해 슈퍼 클래스의 멤버에 접근 할 수 있다.

class Shape {
	public void draw() {
    	System.out.printlm("Shape");
 	}
}

class Line extends Shape {
	public void draw() {
		System.out.printlm("Line");
 	}
}

// 두 방식 모두 오버라이딩
Line line = new Line(); 
line.draw() 

Shape shape = new Line() // 업캐스팅
shape.draw() // 동적바인딩 발생

오버로딩

class MethodOverloading {
	public int getsum(int i, int j){
    	return i + j;
   	}
    public int getsum(int i, int j, int k) {
    	return i + j + k;
    }
}

> 메소드 오버로딩 VS 메소드 오버라이딩

> 추상 클래스

추상 클래스는 추상 메소드를 통해 서브 클래스가 구현할 메소드를 명료하게 알려주는 인터페이스의 역할을 하고, 서브 클래스는 추상 메소드를 목적에 맞게 구현하는 다형성을 실현할 수 있다.

추상 클래스를 이용하면 응용프로그램의 설계와 구현을 분리할 수 있다. 추상 클래스로 기본 방향을 잡아놓고(설계) 서브 클래스에서 구현하면 구현 작업이 쉬어진다. 또한 추상 클래스는 계층적 상속 관계를 가지는 클래스들의 구조를 만들 때 적합하다.

구성: 추상 메소드와 일반 메소드 모두 포함, 상수 변수 필드 모두 포함., 객체 생성 X, 레퍼런스 변수 선언은 가능

> 인터페이스

인테퍼이스는 객체를 생성할 수 없다. 레퍼런스 변수 선언은 가능
인터페이스끼리 상속됨
인터페이스를 구현할 클래스를 작성하면 인터페이스의 모든 추상 메소드를 구현해야함

구성: 변수 필드는 포함하지 않음, 상수, 추상 메소드, 일반 메소드, default 메소드, static 메소드 모두 포함, protected 접근 지정 선언 불가, 다중 상속 지원

> 추상 클래스와 인터페이스

추상 클래스와 인터페이스의 기능적 차이는 알겠다. 그러나 둘의 사용의 차이는 잘 모르겠었다.

추상 메서드는 상속을 통해서 하위 클래스에게 해당 클래스를 유도하는 느낌이라고 보면된다. 미완성 설계도 같이? 예를 들어 "생명체"라는 추상 클래스가 있으면 해당 추상 클래스를 상속받아 "동물", "식물" 같은 하위 클래스를 만들 수 있다. 인터페이스는 기능 위주로 기술한 것이라고 보면 된다.('~할 수 있는' 기본 설계도?) 예를 들어 Human이라는 클래스가 있는데 Talkable, Walkable 이라는 인터페이스를 상속받아서 말하는 능력과 걷는 능력을 구현하는 것이라보면 된다. 그러면 인터페이스로 추상메서드의 기능을 할 수 있지 않을까? 만약에 "생명체" 추상 클래스가 변수(필드) 없이 추상 메서드만 "번식을 한다", "숨을 쉬다"이렇게 메서드 '만'있으면 인터페이스로 구현하는게 맞다.
근데 탄생년도, 세대, 천적 같은 필드가 있다면 인터페이스에서 필드를 구현 못하니 추상 클래스로 구현 할 수 밖에 없다. 추상화의 정도는 인터페이스 > 추상클래스 > 클래스 인데 최대한 추상화의 정도는 가능하면 높게 유지하는게 좋다. 즉 가능하면 인터페이스로 구현되게끔 하고 , 불가피하면 추상클래스를 사용한다. 구현은 클래스에서 진행한다.

추상 클래스와 인터페이스

> 패키지와 모듈

패키지 : 서로 관련 있는 클래스나 인터페이스의 컴파일된 클래스(.class)파일들을 한 곳에 담는 컨테이너
모듈 : 패키지들을 담는 컨테이너, 모듈 파일 (.jmod)로 저장
자바 API : 자바에서 제공하는 기본 클래스들

Java 9 이전까지 자바 API의 모든 클래스들은 rt.jar라는 하나의 단일체로 구성되었고, 자바 가상기계는 응용프로그램 실행 도중, 필요한 클래스 파일을 rt.jar에서 풀어 메모리에 로딩하고 실행하였다. 즉, 일부 클래스만 사용하더라도 rt.jar 전체가 설치되는 구조였다. 자바 9 이후부터는 컴파일한 후, JDK에 있는 jlink 프로그램을 이용하여, 실행에 필요한 모듈만을 묶어 커스텀 modules 파일을 만들었다. 즉, 실행에 필요한 모듈들만으로 꺼내서 사용

자바 모듈화의 목적 : 자바 컴포넌트들을 필요에 따라 조립하여 사용하기 위함이다. 세밀한 모듈화를 통해, 필요 없는 모둘이 로드되지 않게 하여, 컴퓨터 시스템에 불필요한 부담을 줄인다.

> Object 클래스

Object는 java.lang 패키지에 속한 클래스이며, Object만이 아무 클래스도 상속받지 않는 유일한 클래스로 최상위 클래스이다. 모든 클래스들은 Object클래스를 상속한다.

Object 클래스의 toString() : 객체를 문자열로 변환

public String toString() {
	return getClass().getName() + "@" + Integer.toHexString(hashCode));
}

toString()을 오버라이딩하여 자신만의 문자열을 리턴할 수 있다.

Object 클래스의 equals() : 두 객체의 내용물이 같은지 비교

==연산자는 두 객체의 내용물이 같은지 비교하는 것이 아니라, 두 레퍼런스가 같은지, 즉 두 레퍼런스가 동일한 객체를 가리키는지 비교한다.

String 클래스는 두 문자열이 같은지 비교하는 equals()메소드를 오버라이딩하여 가지고 있다.

String a = new String("Hello");
String b = new String("Hello");
if( a == b) 
	System.out.println("a==b");
if( a.equals(b))
	System.out.println("a와 b는 둘다 Hello입니다.");

> Wrapper 클래스

: 자바는 객체지향언어이므로 객체를 대상으로 처리하는 경우가 많음. Wrapper 클래스는 기본 타입의 값을 객체로 만들어 사용할 수 있도록 한다.

박싱 : 기본 타입의 값을 Wrapper 객체로 변환하는 것
언박싱 : Wrapper 객체를 기본 타입의 값으로 변환하는 것

Integer ten = 10; // 자동박싱 , Integer ten = Integer.valuof(10);로 자동 처리
int n = tem; //자동 언박싱, int n = ten.intValue();

profile
방구석개발자

0개의 댓글