개발자상식 <백엔드 개발자> (7)
[책리뷰 & Book review]
인터페이스 시그니처
인터페이스는 Java에서 특정 클래스가 어떤 기능을 반드시 포함하도록 하는 규약 같은 역할을 합니다.
인터페이스에서 메서드 시그니처만 정의하는 이유는 인터페이스를 구현하는 모든 클래스가 해당 메서드를 반드시 구현하도록 강제하기 위함입니다. 이를 통해 개발자가 예상한 특정 기능을 해당 클래스가 반드시 가지도록 할 수 있습니다.
다음은 인터페이스의 작동 방식을 쉽게 이해할 수 있는 코드 예제입니다:
java
interface Animal {
void eat(); // All Animals should be able to eat
}
class Dog implements Animal {
public void eat() {
System.out.println("Dog is eating...");
}
}
class Cat implements Animal {
public void eat() {
System.out.println("Cat is eating...");
}
}
public class Main {
public static void main(String[] args) {
Dog d = new Dog();
d.eat(); // Dog is eating...
Cat c = new Cat();
c.eat(); // Cat is eating...
}
}
위의 코드에서 Animal 인터페이스는 eat() 메소드의 시그니처를 정의하고 있습니다.
이는 모든 동물이 먹는 행동을 해야 한다는 것을 나타냅니다.
Dog 클래스와 Cat 클래스는 Animal 인터페이스를 구현(implements)하고 있습니다.
이는 Dog와 Cat이 반드시 먹는 행동을 해야 한다는 것을 의미합니다.
따라서 Dog 클래스와 Cat 클래스는 Animal 인터페이스에서 정의된 eat() 메서드를 반드시 구현해야 합니다.
이처럼 인터페이스는 특정 클래스가 반드시 가져야 할 기능의 시그니처를 정의하며, 이를 구현하는 클래스는 해당 기능을 반드시 구현해야 합니다. 이는 클래스의 설계와 구현을 일관성 있게 유지하며, 다양한 클래스 간의 상호작용을 용이하게 하는데 도움을 줍니다.
메소드에서 매개변수
메서드에서 매개변수는 메서드가 어떤 값을 받아들일 수 있게 하는 역할을 합니다.
매개변수는 타입과 이름이 있으며, 메서드 내에서 해당 이름으로 해당 값에 접근하여 사용할 수 있습니다.
아래 예제는 메소드 매개변수의 사용법을 보여줍니다:
java
class Main {
// 여기서 "int a, int b, int c"는 매개변수 목록입니다.
static int sum(int a, int b, int c) {
return a + b + c; // a, b, c는 각각 첫 번째, 두 번째, 세 번째 매개변수입니다.
}
public static void main(String[] args) {
int result = sum(10, 20, 30); // sum 메소드에 10, 20, 30을 전달합니다. 이들은 각각 a, b, c에 대응됩니다.
System.out.println("The sum is " + result); // 출력: The sum is 60
}
}
위의 코드에서 sum 메서드는 3개의 매개변수를 받습니다: int a, int b, int c. 이들은 각각 첫 번째, 두 번째, 세 번째 매개변수입니다.
sum(10, 20, 30);을 호출하면, 10은 첫 번째 매개변수 a에, 20은 두 번째 매개변수 b에, 30은 세 번째 매개변수 c에 각각 대응됩니다. 이후 sum 메서드 내에서 이 값을 사용하여 연산을 수행합니다.
이처럼 메소드의 매개변수는 메서드가 필요로 하는 값을 받아들이며, 메서드 내에서 해당 값을 사용하여 원하는 연산을 수행할 수 있게 해 줍니다. 매개변수의 순서와 타입은 메서드 호출 시 전달하는 인자의 순서와 타입에 대응되어야 합니다.
메소드의 매개변수와 인터페이스 시그니처는 서로 다른 개념입니다.
메서드의 매개변수: 메서드가 작동하는 데 필요한 데이터를 제공하는 데 사용됩니다.
특정 메소드를 호출할 때, 해당 메서드가 필요로 하는 데이터를 전달하는 도구입니다.
java
void greet(String name) {
System.out.println("Hello, " + name);
}
위의 greet 메소드는 String 타입의 매개변수 name을 가집니다. 이 메서드를 호출할 때는 greet("John")처럼 인자를 전달해야 합니다.
인터페이스 시그니처: 인터페이스는 메소드의 시그니처만을 정의합니다. 이는 메서드의 이름, 매개변수 타입과 개수, 반환 타입을 포함합니다. 하지만 메서드의 구현 내용 (메서드 본문)은 정의하지 않습니다. 인터페이스를 구현하는 클래스에서 이 메서드를 구현해야 합니다.
java
interface Greeter {
void greet(String name);
}
위의 Greeter 인터페이스는 greet 메소드의 시그니처를 정의하고 있습니다.
이 인터페이스를 구현하는 클래스는 greet 메소드를 구현해야 합니다.
java
class EnglishGreeter implements Greeter {
public void greet(String name) {
System.out.println("Hello, " + name);
}
}
위의 EnglishGreeter 클래스는 Greeter 인터페이스를 구현하고 있으며, greet 메서드를 구현하고 있습니다.
따라서, 메소드의 매개변수와 인터페이스의 메서드 시그니처는 서로 다른 역할을 합니다. 메서드의 매개변수는 메서드가 동작하는데 필요한 데이터를 제공하는 반면, 인터페이스의 메서드 시그니처는 어떤 메서드를 구현해야 하는지를 정의합니다.
클래스 타입이란
Cat c에서 Cat은 클래스 타입입니다. 이는 프로그래머가 Cat 클래스를 정의하면서 설정한 것입니다. Cat 클래스는 앞서 언급하신 것처럼 Animal 인터페이스를 구현하고 있으므로, Animal 타입으로도 취급될 수 있습니다.
Cat 타입을 알아차리는 주체는 컴파일러입니다. 자바 컴파일러는 코드를 해석하고 실행 가능한 바이트 코드로 변환하는 과정에서 각 변수와 객체의 타입을 체크합니다. 이때 Cat c라는 코드를 만나면, 컴파일러는 Cat이라는 클래스를 찾아 해당 클래스의 인스턴스가 c라는 변수에 할당되었음을 인지하게 됩니다.
따라서, Cat c에서 Cat이라는 클래스 타입은 프로그래머가 정의하였고, 이를 인식하고 처리하는 주체는 컴파일러입니다. 이렇게 자바에서는 각 변수와 객체의 타입을 명확하게 지정함으로써 코드의 안정성을 높이고, 의도치 않은 오류를 방지할 수 있습니다.
자는 강타입 언어이다?
자바는 강타입(strongly typed) 언어입니다.
이는 변수의 타입이 한 번 정해지면 그 타입을 변경할 수 없다는 것을 의미합니다.
예를 들어, Cat 타입의 변수에 String이나 int 값을 할당하려고 하면 컴파일러는 이를 오류로 판단하고 컴파일을 중단합니다. 이는 Cat 클래스와 String 또는 int 타입이 서로 호환되지 않기 때문입니다. 각 타입은 자신만의 속성과 메서드를 가지며, 이들은 서로 다른 타입에는 존재하지 않을 수 있습니다.
따라서 Cat c = new Cat();와 같이 Cat 타입의 변수에는 Cat 클래스의 인스턴스만 할당될 수 있습니다. 이처럼 자바에서는 변수의 타입에 맞는 값을 할당하는 것이 중요하며, 강타입 언어의 특성으로 인해 타입 불일치 시 컴파일 오류가 발생합니다.
제네릭 타입으로 타입호환성을 높인다면?
제네릭은 자바에서 타입 안정성을 높이면서 코드의 재사용성을 높이기 위한 기능입니다.
제네릭을 사용하면 컴파일 시점에 타입 체크를 할 수 있어 런타임에 발생할 수 있는 오류를 미리 방지할 수 있습니다.
간단한 예로, ArrayList에 제네릭을 사용하는 경우를 들어보겠습니다.
java
ArrayList<String> list = new ArrayList<String>();
list.add("Hello");
list.add("World");
이 코드에서 ArrayList<String> 부분이 제네릭입니다.
String이라는 타입 파라미터를 통해 이 ArrayList는 String 객체만을 저장한다는 것을 명시적으로 알려줍니다.
따라서 list.add(123);와 같이 String이 아닌 다른 타입의 객체를 추가하려고 하면 컴파일 오류가 발생합니다.
제네릭을 사용하지 않는다면, ArrayList는 모든 타입의 객체를 받을 수 있으므로, 런타임에 원치 않는 타입의 객체가 들어와 오류를 발생시킬 수 있습니다.
이렇게 제네릭을 사용하면 컴파일 시점에 오류를 발견하고 수정할 수 있어, 더 안정적인 코드를 작성할 수 있습니다.
제네릭은 이 외에도 다양한 곳에서 사용됩니다. 예를 들어, 사용자 정의 클래스에서도 제네릭을 사용할 수 있습니다:
java
public class Box<T> {
private T t;
public void set(T t) {
this.t = t;
}
public T get() {
return t;
}
}
위 코드에서 Box<T>에서 T는 타입 파라미터로, 어떤 타입이든 될 수 있습니다. 이 Box 클래스는 T 타입의 객체를 저장할 수 있으며, set 메서드와 get 메서드를 통해 객체를 저장하고 가져올 수 있습니다.
제네릭의 핵심은 <T>와 같은 타입 파라미터를 사용하여 클래스나 메소드가 다양한 타입으로 동작할 수 있도록 하는 것입니다. 여기서 T는 임의의 타입을 대표하는 변수로, 실제 코드에서는 Box <String>, Box <Integer> 등과 같이 원하는 타입을 지정하여 사용합니다.
따라서 Box는 이 예제에서 임의로 정의한 클래스 이름이며, 제네릭 기능은 Box 클래스의 정의에 <T>를 사용하여 구현되었습니다.
이렇게 제네릭을 사용하면 어떤 타입이든 처리할 수 있는 유연한 코드를 작성할 수 있습니다.
#개발자취업 #개발자기초 #개발자 #개발자분야 #개발자분류 #개발자종류 #it개발자 #서버개발자 #개발자성장 #신입개발자 #ios개발자 #개발자노트북 #개발자되는법 #개발 #앱개발 #웹개발 #개발분야 #it개발 #개발공부 #코딩상식 #개발공부 #개발초보
#개발자취업 #개발자면접 #개발자채용 #백엔드개발자 #백엔드개발자 #백엔드개발자취업 #백엔드개발 #프론트엔드개발자 #개발자상담 #백엔드 #개발자 #앱개발자 #웹개발자 #개발자팁 #앱개발자 #백엔드취업 #백엔드공부 #백엔드강의 #백엔드독학
#전산직면접 #면접 #면접팁 #면접관 #공공기관전산직면접 #공사면접 #면접질문 #면접할말 #면접준비 #면접준비 #면접답변 #면접질문 #면접기출 #전화면접 #면접복장 #면접답변 #면접꿀팁 #모의면접 #면접후기 #롯데면접 #면접후기 #임원면접 #최종면접 #면접꿀팁
'컴퓨터공부 > 책리뷰 & book review' 카테고리의 다른 글
개발자상식 <백엔드 개발자> (9)[책리뷰 & Book review] (0) | 2024.01.23 |
---|---|
개발자상식 <백엔드 개발자> (8)[책리뷰 & Book review] (0) | 2024.01.15 |
개발자상식 <백엔드 개발자> (6)[책리뷰 & Book review] (0) | 2024.01.15 |
개발자상식 <백엔드 개발자> (5)[책리뷰 & Book review] (0) | 2024.01.15 |
댓글