[Java] 자바 특징

Lil_Young·2025년 11월 1일

Java

목록 보기
2/2
post-thumbnail

1. 객체 지향 언어

  • 절차 지향 언어와 다르게 하나의 기능을 객체형태로 만들어 객체들을 결합하여 하나의 프로그램을 만드는 것

객체 지향 4대 특성

1. 캡슐화(Encapsulation)

  • 객체의 속성과 기능을 하나로 묶고 외부에서 직접 접근하지 못하게 하여 데이터의 안정성과 일관성을 보장하는 것

    접근제어자 (정보 은닉을 코드로 구현하는 도구)

    • public (+) : 클래스 내부/외부에서 접근이 가능하다.
    • protected (#) : 해당 객체를 상속받은 객체 내부에서 접근할 수 있다. 단순 인스턴스에선 접근할 수 없다.
    • default : 동일한 패키지 내의 객체에서 인스턴스를 생성하여 접근할 수 있다.
    • private (-) : 클래스 내부에서 접근이 가능하나 외부에서 접근할 수 없다.

2. 상속(Inheritance)

  • 재사용 (extends), 부모 클래스에서 선언한 변수나 메서드를 자식 클래스에서 직접 만들지 않고 상속을 받음으로써, 자식 클래스가 부모 클래스의 변수나 메서드를 사용할 수 있는 기능
  • 자바의 모든 class는 Object 클래스의 후손이다.
  • 부모 클래스의 생성자, 초기화 블록은 상속이 되지 않는다.
  • 부모의 private 멤버는 상속은 되지만, 직접 접근은 불가하다.
  • 자바는 단일 상속만 지원한다.
  • Is a (상속관계) : 자식 클래스는 (하나의) 부모 클래스이다.
  • Has a (연관관계) : 한 클래스 멤버변수로 다른 클래스 타입의 참조 변수를 선언한다.

3. 추상화(Abstraction)

  • 객체에서 공통된 속성과 행위를 추출한다.
  • 유연성을 확보하기 위해 구체적인 것은 제거한다는 의미이다.
  • 프로그램에서 필요한 공통점을 추출하고, 불필요한 공통점을 제거하는 과정이다.

4. 다형성(Polymorphism)

하나의 객체가 여러 형태로 동작할 수 있는 성질

  • 오버라이딩 (Overriding)
    - 부모 클래스의 메서드를 자식 클래스에서 재정의(덮어쓰기) 하는 것
    • 메서드 헤드라인 위에 반드시 Annotation, @Override 표시
    • 부모 클래스와 자식 클래스의 메서드를 비교하여 메서드 이름이 동일하거나 매개변수의 개수, 타입, 순서가 동일하다면 메서드를 재정의 할 수 있다. (단, 접근제어자 private 또는 final, static 메서드는 오버라이딩이 불가능함)
  • 오버로딩 (Overloading)
    - 한 클래스 내에서 같은 이름의 메서드를 여러 개 정의하는 것
    • 같은 메서드 이름, 다른 매개변수 선언 조건이어야 사용 가능

2. 컴파일 + 인터프리터 언어

  • 자바는 컴파일 언어인 동시에 인터프리터 언어이다.
  • 자바는 텍스트 소스를 컴파일하여 클래스파일로 만든 다음 자바 런타임이 클래스 파일을 인터프리터 하면서 실행된다.

컴파일

사람이 작성한 소스코드를 기계가 이해할 수 있는 코드(클래스파일)로 변환하는 과정

  • 개발자가 작성한 자바 코드는 Hello.java 같은 텍스트 파일이다.
  • 이걸 바로 컴퓨터가 실행할 수 없기 때문에, 컴파일러(javac)가 바이트코드(.class)로 바꿔준다. (바이트코드는 JVM이 이해할 수 있는 코드)

인터프리터

컴파일된 바이트코드(.class)를 한 줄씩 읽고 실행하는 과정

  • 실제 실행 시에는 JVM이 이 .class 파일을 한 줄씩 읽고 실행한다.

3. 독립적인 플랫폼

  • 어떠한 운영체제라도 독립적으로 자바언어를 사용할 수 있다.
  • 그 이유는 JVM에 의해서 실행되기 때문이다.

JVM (Java Virtual Machine)

자바 프로그램을 실행하기 위한 가상의 컴퓨터

  • 개발자가 만든 코드를 컴파일러가 바이트코드(.class)로 변환한다.
  • 여기서 만들어진 바이트코드는 운영체제에 직접 종속되지 않는 중간 코드이다.
    각 운영체제에는 그 OS에 맞는 JVM이 설치되어 있어서, JVM이 이 바이트코드를 해석(인터프리트)하여 실행시켜 준다.

4. 자동 메모리 관리(GC, Garbage Collection)

  • 자바는 개발자가 직접 메모리에 접근할 수 없으며 자바가 직접 관리한다.
  • 객체 생성시 자동적으로 메모리 영역을 찾아서 할당하고, 사용하지 않는 객체는 제거해준다.
  • C언어는 개발자가 직접 코드를 작성해야 했지만, 자바는 이러한 작업을 자동으로 해주기 때문에 메모리 관리에 신경쓰지 않아도 된다.

JVM의 GC(Garbage Collection)

  • 작동방식
  1. 개발자가 new 키워드로 객체를 생성하면, JVM이 자동으로 Heap 영역에 메모리를 할당한다.
  2. 더 이상 해당 객체를 참조하는 변수가 없으면, GC가 이를 "쓰레기(Garbage)" 객체로 판단한다.
  3. 일정 시점에 GC가 동작하여 이러한 객체를 메모리에서 제거하고, 메모리를 자동으로 회수한다.
  • 참고
  1. GC는 JVM 의 Heap 메모리를 감시하면서 사용되지 않는 객체를 Mark(표시)하고, Sweep(제거)하는 구조로 동작한다.
  2. GC는 백그라운드에서 자동 실행되며, 개발자는 필요 시 System.gc()로 수동 요청할 수도 있지만, 권장되지는 않는다.

5. 멀티 쓰레딩 지원

  • 하나의 프로그램 단위가 동일한 쓰레드를 동시에 수행할 수 있다.
  • 운영체제마다 멀티 쓰레드를 이용하는 API가 다르나 자바의 경우는 자바 API를 사용하기 때문에 쉽게 구현 가능하다.

멀티스레딩

하나의 프로그램(프로세스) 안에서 여러 작업(스레드)을 동시에 실행할 수 있게 하는 기술

6. 동적이다.

  • 객체간의 상호작용을 정의하기 때문에 필요하지 않는 객체는 생성되지 않고, 필요한 객체만 생성하여 사용한다.
  • 오류가 발생하면 발생한 오류의 클래스만 수정하면 되므로 전체를 수정할 필요가 없다. 즉, 유지보수를 쉽고, 빠르게 진행할 수 있다.

7. 안전하고 강력하다.

  • 모든 메모리 접근을 자바 시스템이 관리하기 때문에 시스템 붕괴의 우려가 없다.
  • 자바는 포인터 개념이 없고 유형 정의가 강력하여 실행 전에 클래스 파일을 이용한 프로그램 검사가 가능하다.

0개의 댓글