Search
🙈

Java 기본

Intro::

자바 기본 정리 내용입니다

애플리케이션 실행 과정

1.
컴파일러가 자바 소스를 바이트코드로 변환
2.
class loader가 바이트 코드를 런타임 데이터 영역에 로드시킴
3.
로딩된 바이트 코드가 실행 엔진에 의해서 실행

자바 메모리 구조

스레드별
PC Register
현재 수행중인 JVM 명령어
JVM Stack
호출된 메소드의 매개변수, 지역변수, 리턴정보
Native Method Stack
자바 외의 언어인 C, C++ 들을 수행하기 위한 영역
공통
Method Area
클래스 별로 전역변수, 지역변수, 메소드 정보 저장
Heap
런타임중 생성되는 객체들이 동적으로 할당

가비지 컬렉션

JVM 에서 메모리 관리해주는 모듈
heap 메모리에서 더 이상 참조되지 않는 객체들을 제거해주는 모듈
개발자가 직접 해제하지 않아도 됨
가비지컬렉션을 최적화 하는 방법
힙(Heap) 및 세대(Generation) 크기 조정
적절한 GC 알고리즘 선택
가비지컬렉션때문에 메모리누수기 발생하는 이유
참조가 해제되지 않아 GC 대상이 되지 않는 경우
컬렉션에 추가된 뒤 해제되지 않는 객체

객체지향 프로그래밍

현실 세계의 사물같은 객체를 만들고, 객체에서 필요한 특징을 뽑아 프로그래밍 수행
추상화
추상화는 객체가 가져야 할 핵심 속성과 동작만 남기고, 불필요한 세부 구현을 감추는 개념입니다. 자바에서는 추상 클래스(abstract class)나 인터페이스(interface)를 통해 추상화를 표현합니다.
// 추상 클래스 예시 public abstract class Shape { // 추상 메서드: 자식 클래스에서 반드시 구현해야 함 public abstract double area(); // 일반 메서드: 모든 도형이 공통으로 사용할 수 있음 public void show() { System.out.println("도형의 면적: " + area()); } } // 추상 클래스를 상속한 자식 클래스 public class Circle extends Shape { private double radius; public Circle(double radius) { this.radius = radius; } @Override public double area() { return Math.PI * radius * radius; } } // 사용 예시 public class Main { public static void main(String[] args) { Circle circle = new Circle(3.0); circle.show(); // 출력: "도형의 면적: 28.274333882308138" } }
Java
복사
캡슐화
캡슐화는 객체의 속성과 동작을 하나로 묶고, 내부 구현을 감추는 원칙입니다. 외부에서는 직접 필드에 접근하지 못하고, 메서드를 통해서만 값을 읽거나 변경하도록 합니다. 이를 통해 내부 데이터의 무결성을 지키고, 코드 유지보수를 쉽게 합니다.
public class Person { private String name; // 외부에서 직접 접근 불가 private int age; // 외부에서 직접 접근 불가 public Person(String name, int age) { this.name = name; this.age = age; } // Getter 메서드: 외부에서 name 값을 읽을 때 사용 public String getName() { return name; } // Setter 메서드: 외부에서 age 값을 변경할 때 사용 public void setAge(int age) { if (age >= 0) { this.age = age; } } } // 추상 클래스 예시 public abstract class Shape { // 추상 메서드: 자식 클래스에서 반드시 구현해야 함 public abstract double area(); // 일반 메서드: 모든 도형이 공통으로 사용할 수 있음 public void show() { System.out.println("도형의 면적: " + area()); } } // 추상 클래스를 상속한 자식 클래스 public class Circle extends Shape { private double radius; public Circle(double radius) { this.radius = radius; } @Override public double area() { return Math.PI * radius * radius; } } // 사용 예시 public class Main { public static void main(String[] args) { Circle circle = new Circle(3.0); circle.show(); // 출력: "도형의 면적: 28.274333882308138" } }
Java
복사
상속
상속은 기존 클래스의 속성과 동작을 재사용하고, 새로운 기능을 추가하거나 변경하는 개념입니다. 자바에서는 extends 키워드를 사용해 상속받습니다. 부모 클래스(슈퍼클래스)의 필드와 메서드를 자식 클래스(서브클래스)에서 그대로 사용할 수 있으며, 필요에 따라 오버라이딩(재정의)할 수도 있습니다.
// 부모 클래스(슈퍼클래스) public class Animal { public void sound() { System.out.println("동물이 소리를 냅니다."); } } // 자식 클래스(서브클래스) public class Dog extends Animal { // 메서드 오버라이딩: 부모 클래스의 sound()를 변경 @Override public void sound() { System.out.println("강아지가 멍멍 짖습니다."); } } // 사용 예시 public class Main { public static void main(String[] args) { Animal myAnimal = new Animal(); myAnimal.sound(); // 출력: "동물이 소리를 냅니다." Dog myDog = new Dog(); myDog.sound(); // 출력: "강아지가 멍멍 짖습니다." } } public class Person { private String name; // 외부에서 직접 접근 불가 private int age; // 외부에서 직접 접근 불가 public Person(String name, int age) { this.name = name; this.age = age; } // Getter 메서드: 외부에서 name 값을 읽을 때 사용 public String getName() { return name; } // Setter 메서드: 외부에서 age 값을 변경할 때 사용 public void setAge(int age) { if (age >= 0) { this.age = age; } } }
Java
복사
다형성
다형성은 같은 부모 타입 변수에 서로 다른 자식 객체를 할당해, 실행 시점에 적절한 메서드가 호출되는 특징을 말합니다. 이를 통해 코드의 확장성과 유연성을 높일 수 있습니다.
public class Cat extends Animal { @Override public void sound() { System.out.println("고양이가 야옹 웁니다."); } } public class Main { public static void main(String[] args) { Animal animal1 = new Dog(); // 부모 타입 변수에 자식 객체 할당 Animal animal2 = new Cat(); // 마찬가지로 다른 자식 객체 할당 animal1.sound(); // 실행 결과: "강아지가 멍멍 짖습니다." animal2.sound(); // 실행 결과: "고양이가 야옹 웁니다." } }
Java
복사

객체지향의 장점

1.
재사용성: 한 번 만든 클래스를 여러 곳에서 사용할 수 있어 중복 코드를 줄일 수 있습니다.
2.
유지보수성: 객체 단위로 분리되어 있어, 특정 기능만 수정하거나 확장하기가 용이합니다.
3.
유연성: 상속과 다형성을 활용해 요구사항 변경에 유연하게 대응할 수 있습니다.
4.
모듈화: 프로그램을 작은 단위(클래스)로 나누어 관리하므로, 협업 시에도 역할 분담이 쉽고 전체 구조를 이해하기가 수월합니다.

인터페이스

행위 위주로 기능을 명세할 때
다형성을 극대화하고 싶을 때

추상클래스

"공통 상태 + 공통 동작 + 일부 추상 동작"을 공유하고 싶을 때
항목
추상 클래스 (abstract class)
인터페이스 (interface)
상속
단일 상속만 가능
다중 구현 가능 (다중 상속 유사)
메서드
구현된 메서드 + 추상 메서드 혼합 가능
기본적으로 모두 추상 메서드 (default, static은 구현 가능)
필드
인스턴스 변수 선언 가능
public static final 상수만 가능
생성자
가질 수 있음
생성자 없음
용도
“기반 기능 + 공통 구현 제공”
“행위 명세(계약)”을 정의
상속 키워드
extends
implements
핵심 차이는 생성자, 다중 상속 차이, 가질 수 있는 필드 차이가 있다.

References::