1. 메서드의 선언
정리
- new 연산자를 사용할 때마다 메모리에 인스턴스가 생성된다.
- 인스턴스는 더 이상 참조되는 것이 없을 때, 나중에(언제 될지는 모른다. 보통 메모리가 부족할 때) 가비지 컬렉션(Garbage Collection) 된다.
- static한 필드는 클래스가 로딩될 때 딱 한번 메모리에 올라가고 초기화 된다.
- 인스턴스 메소드(static이 안붙은 메소드)는 인스턴스를 생성하고나서 레퍼런스 변수를 이용해 사용할 수 있다.
- 클래스 메소드는 클래스명. 메소드명() 으로 사용가능하다.
- 메소드 안에 선언된 변수들은 메소드가 실행될 때 메모리에 생성되었다가, 메소드가 종료될 때 사라진다.
객체지향 프로그래밍(OOP) : 캡상추다(캡슐화, 상속, 추상화, 다형성).
- 좋은 객체는 응집도는 높고 결합도(Coupling)는 낮다. (응높결낮)
캡슐화
- 데이터(필드)와 메서드(동작)를 하나로 묶고, 외부로부터 데이터를 보호하는 개념
(객체지향 프로그래밍(OOP)의 핵심 원칙 중 하나)
캡슐화의 핵심 목표
- 데이터 보호:
- 외부 코드가 직접 데이터를 수정하거나 잘못된 값을 입력하지 못하도록 보호.
- 정보 은닉(Information Hiding):
- 내부 구현 세부사항을 감추고, 필요한 기능만 외부에 공개.
- 접근 제어:
- private, protected, public 등의 접근 제어자를 사용하여 클래스 내부 데이터의 접근 범위를 제한.
캡슐화의 특징
- 클래스 내부에 데이터를 숨김:
- 필드를 private으로 선언하여 외부에서 직접 접근하지 못하도록 함.
- 간접 접근 제공:
- 데이터를 안전하게 수정하거나 읽을 수 있도록 getter와 setter 메서드를 제공.
캡슐화의 장점
- 데이터 보호:
- 필드 값을 직접 수정하지 못하도록 하고, 유효성 검사를 통해 잘못된 값을 방지.
- 유지보수 용이:
- 클래스 내부의 구현을 수정해도 외부 코드에 영향을 주지 않음.
- 코드의 재사용성 증가:
- 캡슐화된 클래스를 재사용하거나 확장하기 쉬움.
- 가독성 향상:
- 내부 구현을 감추고, 필요한 기능만 제공함으로써 코드의 가독성을 높임.
캡슐화와 접근 제어자
접근 제어자 | 같은 클래스 | 같은 패키지 | 하위 클래스 | 외부 클래스 |
public | O | O | O | O |
protected | O | O | O | X |
(default) | O | O | X | X |
private | O | X | X | X |
결론
캡슐화는 객체지향 프로그래밍에서 데이터를 보호하고 안정적인 동작을 보장하기 위한 중요한 개념임. 데이터와 메서드를 하나로 묶어 클래스 내부의 구현을 감추고, 필요한 부분만 공개함으로써 안전하고 유지보수하기 쉬운 코드를 작성할 수 있음.
상속(Inheritance)
- 기존 클래스(부모 클래스)의 특성과 동작을 새로운 클래스(자식 클래스)에 물려주는 것.
- 코드 재사용성을 높이고, 계층 구조를 형성.
- extends 키워드를 사용하여 상속 구현.
추상화(Abstraction)
- 불필요한 세부사항을 숨기고, 필요한 핵심적인 기능에만 집중.
- 추상 클래스(abstract class)와 인터페이스(interface)를 통해 구현.
- 개발자가 필요한 기능의 틀만 제공하고, 구체적인 구현은 상속받은 클래스에서 처리.
다형성(Polymorphism)
- 같은 이름의 메서드가 여러 형태로 동작할 수 있도록 함
- 메서드 오버로딩과 오버라이딩, 그리고 상속 관계에서의 동적 바인딩을 포함.
- 부모 클래스의 참조 변수로 자식 클래스 객체를 참조할 수 있음.
요약: "캡상추다" 정리
특징 | 설명 | 주요 키워드 |
캡슐화 | 데이터 보호 및 정보 은닉. 외부에 필요한 기능만 공개. | private, getter, setter |
상속 | 부모 클래스의 특성을 자식 클래스가 물려받아 재사용 가능. | extends, super |
추상화 | 복잡한 구현을 숨기고, 핵심적인 기능에만 집중. | abstract class, interface |
다형성 | 하나의 이름으로 다양한 형태의 동작을 수행. | method overriding, method overloading |
패키지
- Java에서 클래스를 논리적으로 묶는
- 비슷한 기능을 하는 클래스나 인터페이스를 그룹화하여 코드 관리와 충돌 방지를 도와줌.
- 패키지는 폴더와 동일한 구조로 파일 시스템에 저장됨.
패키지의 주요 목적
- 코드 관리:
- 관련 있는 클래스와 인터페이스를 그룹화하여 관리하기 쉽게 만듦.
- 클래스 이름 충돌 방지:
- 동일한 이름의 클래스를 다른 패키지에서 사용할 수 있음.
- 접근 제어:
- default 접근 제어를 사용하면 동일한 패키지 내에서만 클래스에 접근 가능.
패키지 이름 규칙
- 소문자 사용:
- 패키지 이름은 모두 소문자로 작성.
- 예: com.example.myapp
- 역방향 도메인 이름 사용:
- 충돌 방지를 위해 일반적으로 도메인 이름을 역순으로 사용.
- 파일 경로와 일치:
- 선언된 패키지는 파일 시스템의 디렉터리 구조와 일치해야 함.
- 예: package com.example.myapp;는 com/example/myapp 디렉터리에 저장.
2. 패키지 사용
- 다른 클래스에서 패키지에 포함된 클래스를 사용하려면 import 선언 필요.
- 예시)
- 패키지가 없으면 클래스 충돌이 발생하거나, 코드 관리가 어려움. 따라서 대규모 프로젝트에서는 패키지 사용이 필수적임. 따라서 패키지는 Java 코드의 논리적 그룹화와 클래스 충돌 방지를 위해 필수적인 요소이다.