Java 78

[JAVA] 중첩 클래스

객체지향 프로그램에서는 클래스 간에 서로 긴밀한 관계를 맺고 상호작용한다. 클래스가 여러 클래스와 관계를 맺는 경우에는 독립적으로 선언하는 것이 좋으나, 특정 클래스만 관계를 맺을 경우에는 중첩 클래스로 선언하는 것이 유지보수에 도움이 되는 경우가 많다. 중첩클래스란 클래스 내부에 선언한 클래스를 말하는데, 중첩 클래스를 사용하면 클래스의 멤버를 쉽게 사용할 수 있고 외부에는 중첩 관계 클래스를 감춤으로써 코드의 복잡성을 줄일 수 있다는 장점이 있다. 중첩 클래스는 선언하는 위치에 따라 두 가지로 분류된다. 클래스의 멤버로서 선언되는 중첩 클래스를 멤버 클래스라고 하고, 메서드 내부에서 선언되는 중첩 클래스를 로컬 클래스라고 한다.선언 위치에 따른 분류선언 위치객체 생성 조건멤버 클래스인스턴스멤버 클래스..

Language/JAVA 2024.09.04

[JAVA] 인터페이스

인터페이스(Interface)는 사전적인 의미로 두 장치를 연결하는 접속기를 말한다. 여기서 두 장치를 서로 다른 객체로 본다면, 인터페이스는 이 두 객체를 연결하는 역할을 한다. 두 객체를 직접 호출하면 간단할 텐데 왜 중간에 인터페이스를 거치도록 하는 것일까? 예를 들어 객체 A와 객체 B가 있다고 가정해 보자. 객체 B가 객체 C로 교체됐을 때 직접 호출한 상태였다면 객체 A의 소스 코드를 객체 B에서 객체 C로 변경하는 작업이 추가로 필요할 것이다. 하지만 인터페이스의 메서드로 호출한다면 교체된다 해도 소스 코드를 고칠 필요가 없다. 객체 A는 인터페이스의 메서드만 사용하므로 B와 C가 변경되는 것에 관심이 없기 때문이다. 이 특징으로 인해 인터페이스는 다형성 구현에 주된 기술로 이용된다. 상속을..

Language/JAVA 2024.09.04

[JAVA] 봉인된 클래스

기본적으로 final 클래스를 제외한 모든 클래스는 부모 클래스가 될 수 있다. 그러나 Java 15부터는 무분별한 자식 클래스 생성을 방지 하기 위해 봉인된(sealed) 클래스가 도입되었다.  다음과 같이 Person의 자식 클래스는 Employee와 Manager만 가능하고, 그 이외는 자식 클래스가 될 수 없도록 Person을 봉인된 클래스로 선언할 수 있다.public sealed class Person permits Employee, Manager {...} sealed 키워드를 사용하면 permits 키워드 뒤에 상속 가능한 자식 클래스를 지정해야 한다. 봉인된 Person 클래스를 상속하는 Employee와 Manager는 final 또는 non-sealed 키워드로 다음과 같이 선언하거나..

Language/JAVA 2024.09.04

[JAVA] 추상 클래스

사전적 의미로 추상은 실체 간에 공통되는 특성을 추출한 것을 말한다. 예를 들어 새, 곤충, 물고기 등의 공통점은 동물이다. 여기서 동물은 실체들의 공통되는 특성을 가지고 있는 추상적인 것이라고 볼 수 있다. 추상 클래스객체를 생성할 수 있는 클래스를 실체 클래스라고 한다면, 이 클래스들의 공통적인 필드나 메서드를 추출해서 선언한 클래스를 추상 클래스라고 한다. 추상 클래스는 실체 클래스의 부모 역할을 한다. 따라서 실체 클래스는 추상 클래스를 상속해서 공통적인 필드나 메서드를 물려받을 수 있다. 예를 들어 Bird, Insect, Fish와 같은 실체 클래스에서 공통되는 필드와 메서드를 따로 선언한 Animal 클래스를 만들 수 있고, 이것을 상속해서 실체 클래스를 만들 수 있다. 추상클래스는 실체 클..

Language/JAVA 2024.09.04

[JAVA] 상속2

final 클래스와 final 메서드필드 선언 시에 final을 붙이면 초기값 설정 후 값을 변경할 수 없다. 그렇다면 클래스와 메서드에 final을 붙이면 어떤 효과가 일어날까? final 클래스와 final 메서드는 상속과 관련이 있다. final 클래스클래스가 선언할 때 final 키워드를 class 앞에 붙이면 최종적인 클래스이므로 더 이상 상속할 수 없는 클래스가 된다. 즉 final 클래스는 부모 클래스가 될 수 없어 자식 클래스를 만들 수 없다.public final class 클래스 {...} final 메서드메서드를 선언할 때 final 키워드를 붙이면 이 메서드는 최종적인 메서드이므로 오버라이딩할 수 없는 메서드가 된다. 즉 부모 클래스를 상속해서 자식 클래스를 선언할 때, 부모 클래스..

Language/JAVA 2024.09.04

[JAVA] 상속

상속 개념상속(Inheritance)은 부모가 자식에게 물려주는 행위를 말한다. 객체지향 프로그램에서도 부모 클래스의 필드와 메서드를 자식 클래스에게 물려줄 수 있다. 상속은 이미 잘 개발된 클래스를 재사용해서 새로운 클래스를 만들기 때문에 중복되는 코드를 줄여 개발 시간을 단축시킨다. 상속의 또 다른 이점은 클래스의 수정을 최소화할 수 있다는 것이다. 부모 클래스를 수정하면 모든 자식 클래스에 수정 효과를 가져온다. 예를 들어 B, C가 A를 상속할 경우 A의 필드와 메서드를 수정하면 B, C를 수정하지 않아도 수정된 A 필드와 메서드를 이용할 수 있다. 클래스 상속현실에서의 상속은 부모가 자식을 선택해서 물려주지만, 프로그램에서는 자식이 부모를 선택한다. 자식 클래스를 선언할 때 어떤 부모로부터 상속..

Language/JAVA 2024.09.04

[JAVA] 싱글톤 패턴

애플리케이션 전체에서 단 한 개의 객체만 생성해서 사용하고 싶다면 싱글톤(Singleton) 패턴을 적용할 수 있다. 싱글톤 패턴의 핵심은 생성자를 private 접근 제한해 외부에서 new 연산자로 생성자를 호출할 수 없도록 막는 것이다.private 클래스() {} 생성자를 호출할 수 없으니 외부에서 마음대로 객체를 생성하는 것이 불가능해진다. 대신 싱글톤 패턴이 제공하는 정적 메서드를 통해 간접적으로 객체를 얻을 수 있다.public class 클래스 { // private 접근 권한을 갖는 정적 필드 선언과 초기화 private static 클래스 singleton = new 클래스(); // private 접근 권한을 갖는 생성자 선언 private 클래스() {} ..

Language/JAVA 2024.09.04

[JAVA] Getter와 Setter

객체의 필드(데이터)를 외부에서 마음대로 읽고 변경할 경우 객체의 무결성(결점이 없는 성질)이 깨질 수 있다. 예를 들어 자동차의 속력은 음수가 될 수 없는데, 외부에서 음수로 변경하면 객체의 무결성이 깨진다.Car myCar = new Car();myCar.speed = -100; 이러한 문제점 때문에 객체지향 프로그래밍에서는 직접적인 외부에서의 필드 접근을 막고, 그 대신 메서드를 통해 필드에 접근하는 것을 선호한다. 그 이유는 메서드가 데이터를 검증해서 유효한 값만 필드에 저장할 수 있기 때문이다. 이러한 역할을 하는 메서드가 Setter이다. 다음 코드를 보자. speed 필드는 private 접근 제한을 가지므로 외부에서 접근하지 못한다. speed 필드를 변경하기 위해서는 Setter인 set..

Language/JAVA 2024.09.04

[JAVA] 접근 제한자

경우에 따라서는 객체의 필드를 외부에서 변경하거나 메서드를 호출할 수 없도록 막아야 할 필요가 있다. 중요한 필드와 메서드가 외부로 노출되지 않도록 해 객체의 무결성(결점이 없는 성질)을 유지하기 위해서이다. 자바는 이러한 기능을 구현하기 위해 접근 제한자(Access Modifier)를 사용한다. 접근 제한자는 다음 표처럼 나눌 수 있다.접근 제한자제한 대상제한 범위public클래스, 필드, 생성자, 메서드없음protected필드, 생성자, 메서드같은 패키지이거나, 자식 객체(default)클래스, 필드, 생성자, 메서드같은 패키지private필드, 생성자, 메서드객체 내부 (클래스 내부) 클래스의 접근 제한클래스를 어디에서나 사용할 수 있는 것은 아니다. 클래스가 어떤 접근 제한을 갖느냐에 따라 사용..

Language/JAVA 2024.09.04

[JAVA] import 문

같은 패키지에 있는 클래스는 아무 조건 없이 사용할 수 있지만, 다른 패키지에 있는 클래스를 사용하려면 import 문을 이용해서 어떤 패키지의 클래스를 사용하는지 명시해야 한다.package com.mycompany;import com.hankook.Tire;public class Car { Tire tire = new Tire();} import 문이 작성되는 위치는 패키지 선언과 클래스 선언 사이이다. import 키워드 뒤에는 사용하고자 하는 클래스의 전체 이름을 기술한다. 만약 동일한 패키지에 포함된 다수의 클래스를 사용해야 한다면 클래스 이름은 생략하고 *를 사용할 수 있다.import com.hankook.*; import 문은 하위 패키지를 포함하지 않는다. 따라서 여러 패키지를 사용하려면..

Language/JAVA 2024.09.04