개발 일지/Java 54

[Java] 제네릭(Generic)

자바 프로그래밍에서 제네릭(generic)이란, 데이터의 타입을 일반화한다는 것을 의미한다. 다양한 타입의 데이터를 저장할 수 있는 객체를 만들고자 한다면, 각 타입별로 클래스를 따로 생성해야 하지만 제네릭을 사용하면 단 하나의 클래스만으로 모든 타입의 데이터를 저장할 수 있는 인스턴스를 만들 수 있다. 제네릭은 클래스와 메서드에 다음과 같은 방법으로 선언할 수 있다. class Basket { private T item; public Basket(T item) { this.item = item; } public T getItem() { return item; } public void setItem(T item) { this.item = item; } } 위 코드에서 사용된 T는 타입 변수이며, 임의의 ..

개발 일지/Java 2023.01.04

[Java] 열거형(enumerated type, enum)

열거형(enum)은 여러 상수들을 보다 편리하게 선언할 수 있도록 만들어진 자바의 문법요소이다. 주로 서로 관련 있는 내용들을 모아서 한 번에 간편하게 관리할 때 사용한다. enum은 JDK 1.5 이상의 버전에서만 사용이 가능하다. 이전의 버전에는 enum 문법을 지원하지 않았기 때문에 여러 상수를 정의해서 사용하기 위해서는 public static final을 통해 전역변수로 상수를 설정해서 사용했다. 하지만 이러한 방식은 상수명이 중복되는 경우가 종종 발생할 수 있고 컴파일 에러를 유발한다. 이 문제는 인터페이스를 사용해서 상수를 구분함으로써 해결할 수 있지만, 타입 안정성이라는 새로운 문제가 발생한다. 따라서, 이러한 모든 문제를 해결하기 위해 만들어진 것이 enum이다. 즉, 자바에서 열거형은 ..

개발 일지/Java 2023.01.04

[Java] 인터페이스(Interface)

컴퓨터 프로그래밍에서 사용하는 인터페이스는 '서로 다른 두 시스템, 장치, 소프트웨어 따위를 서로 이어주는 부분 또는 그런 접속 장치'라고 정의할 수 있다. 하위 클래스가 여러 상위 클래스를 상속받을 수 있다면 다양한 동작을 수행할 수 있지만, 이러한 경우 메서드 출처의 모호성 등 여러 문제가 발생할 수 있기에 자바 프로그래밍에서는 클래스를 통한 다중 상속을 지원하지 않는다. 하지만 다중 상속의 이점을 살리기 위해 자바는 인터페이스라는 것을 통해 다중 상속을 지원한다. 기본적으로 인터페이스도 추상 클래스처럼 자바에서 추상화를 구현하는 데 사용되는 점은 동일하지만, 추상 클래스에 비해 더 높은 추상성을 가진다는 점에서 큰 차이가 있다. 추상 클래스를 설계가 모두 끝나지 않은 '미완성 설계도'에 비유한다면 ..

개발 일지/Java 2023.01.02

[Java] final 키워드

final은 사전적으로 '최종의, 마지막의'라는 의미를 가진다. 변수(variable), 메서드(method), 클래스(class)에 사용될 수 있으며 어떤 곳에 사용되느냐에 따라 다른 의미를 가진다. 하지만 공통적으로 변경이 불가능하고 확장할 수 없다는 점에서 유사하다. final 키워드가 붙으면 다음과 같은 의미를 가지게 된다. 클래스 - 변경 또는 확장 불가능한 클래스, 상속 불가 메서드 - 오버라이딩 불가 변수 - 값 변경이 불가한 상수 final class FinalEx { // 확장, 상속이 불가능한 클래스 final int x = 1; // 변경되지 않는 상수 final int getNum() { // 오버라이딩이 불가한 메서드 final int localVar = x; // 상수 retur..

개발 일지/Java 2023.01.02

[Java] 추상화(Abstraction)

추상화의 사전적 의미는 '사물이나 표상을 어떤 성질, 공통성, 본질에 착안하여 그것을 추출하여 파악하는 것'이다. 여기서 핵심적인 개념은 '공통성과 본질을 모아 추출하는 것'이다. 자바 프로그래밍에서의 추상화는 객체의 공통적인 속성과 기능을 추출하여 정의하는 것을 의미한다. 상속이 하위 클래스를 정의하는 데 상위 클래스를 사용하는 것이라고 한다면 추상화는 기존 클래스들의 공통적인 요소들을 뽑아서 상위 클래스를 만들어 내는 것이다. 예를 들어, 강아지나 고양이 등의 애완동물은 먹기, 걷기 등의 행동을 하기 때문에 '애완동물'이라는 추상 클래스를 만들 수 있다. 이렇게 공통적인 속성과 기능을 모아서 정의해주면 코드의 중복을 줄일 수 있고, 보다 효과적으로 클래스 간의 관계를 설정할 수 있으며 유지 보수가 용..

개발 일지/Java 2022.12.30

[Java] instanceof 연산자

instanceof 연산자는 객체가 어떤 클래스인지, 어떤 클래스를 상속받았는지 확인하는 데 사용하는 연산자이다. 자바의 문법요소로 캐스팅이 가능한 지 여부를 boolean 타입으로 확인할 수 있다. 캐스팅 가능 여부를 판단하기 위해서는 '객체를 어떤 생성자로 만들었는가'와 '클래스 사이에 상속관계가 존재하는가'를 판단해야 한다. 프로젝트의 규모가 커지고 클래스가 많아지면 매번 이러한 정보를 확인하기 힘들어지는데, 이를 해결하기 위해 자바는 instanceof 라는 연산자를 제공한다. 참조변수 instanceof 타입 이렇게 입력했을 때 리턴 값으로 true가 나오면 참조 변수가 검사한 타입으로 타입 변환이 가능하며, false가 나온다면 타입 변환이 불가능하다. 참조 변수가 null인 경우에도 fals..

개발 일지/Java 2022.12.30

[Java] 참조 변수의 타입 변환

참조 변수의 타입 변환은 '사용할 수 있는 멤버의 개수를 조절하는 것'을 의미한다. 타입 변환을 위해서는 다음의 세 가지 조건을 충족해야 한다. 서로 상속관계에 있는 상위 클래스와 하위 클래스 사이에서만 타입 변환이 가능하다. 하위 클래스 타입에서 상위 클래스 타입으로 타입 변환(업캐스팅)은 형변환 연산자(괄호)를 생략할 수 있다. 상위 클래서에서 하위 클래스 타입으로 변환(다운캐스팅)은 형변환 연산자(괄호)를 반드시 명시해야 한다. package Practice; class Vehicle { String model; String color; int wheels; void startEngine() { System.out.println("시동 걸기"); } void accelerate() { System...

개발 일지/Java 2022.12.30

[Java] 다형성(Polymorphis)

다형성(polymorphis)은 상속, 캡슐화, 추상화와 더불어 객체 지향 프로그래밍을 구성하는 중요한 특징 중 하나이며, '하나의 객체가 여러 가지 타입을 가질 수 있는 것'을 의미한다. 자바 프로그래밍에서 다형성은 한 타입의 참조 변수를 통해 여러 타입의 객체를 참조할 수 있도록 만든 것을 의미한다. 즉, 상위 클래스 타입의 참조 변수를 통해서 하위 클래스의 객체를 참조할 수 있도록 허용한 것이라고 할 수 있다. package Practice; class Animal { public void animalInfo() { System.out.println("저는 동물입니다."); } } class Dog extends Animal { public void animalInfo() { System.out.p..

개발 일지/Java 2022.12.30

[Java] getter과 setter 메서드

객체 지향 프로그래밍에서 객체의 데이터는 객체 외부에서 직접적으로 접근하는 것을 막는다. 데이터는 외부에서 접근하지 않도록 막고 메서드는 공개해서 외부에서 메서드를 통해 데이터에 접근하도록 유도한다. 대표적으로 private 접근 제어자가 포함되어 있는 객체 변수의 데이터 값을 추가하거나 수정하고 싶을 때 사용하는 메서드가 getter과 setter 메서드이다. class Animal { private String name; private int age; private String id; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { retu..

개발 일지/Java 2022.12.29

[Java] 캡슐화(Encapsulation)

캡슐화(encapsulation)란, 특정 객체 안에 관련된 속성과 기능을 하나의 캡슐(capsule)로 만들어 데이터를 외부로부터 보호하는 것을 의미한다. 이렇게 캡슐화를 해야 하는 이유는 '데이터 보호의 목적'과 '내부적으로만 사용되는 데이터에 대한 불필요한 외부 노출'을 방지하기 위함이다. 즉, 캡슐화는 관련이 있는 변수와 함수를 하나의 클래스로 묶고 외부에서 쉽게 접근하지 못하도록 은닉하는 것이다. 외부로부터 객체의 속성과 기능이 함부로 변경되지 못하게 막고, 데이터가 변경되더라도 다른 객체에 영향을 주지 않기 때문에 독립성을 확보할 수 있다. 또한, 유지보수와 코드 확장 시에도 오류의 범위를 최소화할 수 있어서 효과적인 코드 유지보수에 용이하다. 캡슐화는 자바 프로그래밍에서 4가지의 접근 제어자..

개발 일지/Java 2022.12.29