# 음 ,,, 하기 싫어 ! ~
Q. enum이 뭐지?
enum은 열거형(enumeration)의 줄임말로, 프로그래밍에서 사용되는 데이터 유형입니다. 열거형은 연관된 상수들의 집합을 나타내는 자료형입니다. 각각의 상수는 특정한 값을 가지며, 이러한 상수들은 주로 관련된 개념, 유형 또는 옵션을 표현하기 위해 사용됩니다.
열거형은 주로 프로그램에서 고정된 값들의 집합을 정의하고 싶을 때 사용됩니다. 예를 들어, 요일을 나타내는 상수 집합을 열거형으로 정의할 수 있습니다.
다음은 C++에서의 열거형의 예입니다:
cpp
Copy code
enum Day {
Sunday,
Monday,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday
};
위의 코드에서 Day는 열거형의 이름이며, Sunday, Monday, Tuesday, 등은 해당하는 상수들입니다. 각 상수는 0부터 시작하여 순서대로 증가하는 값을 가집니다. 즉, Sunday는 0, Monday은 1, Tuesday는 2, ... 와 같은 값을 갖게 됩니다.
열거형을 사용하면 코드의 가독성을 높일 수 있고, 올바른 값의 선택을 보장할 수 있습니다. 또한, switch 문 등에서 열거형을 사용하여 각각의 경우를 처리하기도 편리합니다. 다양한 프로그래밍 언어에서 열거형을 지원하며, 언어에 따라 문법이 조금씩 다를 수 있습니다.
Q. 자바에서의 접근 제어자?
다음은 Java에서 사용되는 주요한 접근 제어자들입니다:
public: public 접근 제어자는 가장 넓은 범위의 접근 수준을 나타냅니다. public으로 선언된 클래스, 멤버 변수 또는 메서드는 어디서든 접근할 수 있습니다.
private: private 접근 제어자는 가장 제한적인 접근 수준을 나타냅니다. private으로 선언된 멤버 변수 또는 메서드는 해당 클래스 내에서만 접근할 수 있으며, 외부에서는 직접 접근할 수 없습니다.
protected: protected 접근 제어자는 private보다 넓은 범위의 접근 수준을 나타냅니다. protected로 선언된 멤버 변수 또는 메서드는 동일한 패키지 내의 클래스와 해당 클래스를 상속한 클래스에서 접근할 수 있습니다.
(default): 접근 제어자를 명시적으로 지정하지 않은 경우, 기본 접근 제어자가 적용됩니다. 이를 (default) 또는 패키지 접근 제어자라고도 합니다. (default)로 선언된 클래스, 멤버 변수 또는 메서드는 동일한 패키지 내에서만 접근할 수 있습니다.
접근 제어자들은 클래스, 멤버 변수, 메서드 등을 적절한 수준으로 제한하여 데이터 은닉과 캡슐화를 실현하는 데 도움을 줍니다. 이를 통해 코드의 안정성을 높이고 잘못된 접근으로부터 보호할 수 있습니다. Java에서는 객체 지향 프로그래밍의 원칙을 따르는 적절한 접근 제어자의 사용이 권장됩니다.
Q. Vector 이 뭐야?
vector는 C++ 표준 라이브러리의 컨테이너 클래스 중 하나입니다. vector는 동적 배열(dynamic array)을 구현한 것으로, 크기가 가변적으로 조정될 수 있습니다. 요소들은 메모리 상에 연속적으로 저장되며, 임의의 위치에 빠르게 접근할 수 있습니다.
vector는 다양한 방식으로 응용될 수 있습니다. 몇 가지 예시를 살펴보겠습니다:
데이터 저장: vector는 여러 요소들을 저장하는데 사용될 수 있습니다. 요소들은 순차적으로 저장되기 때문에 인덱스를 사용하여 특정 요소에 빠르게 접근할 수 있습니다. 예를 들어, 정수, 실수, 문자열 등과 같은 데이터를 저장하고 검색하기 위해 vector를 활용할 수 있습니다.
동적 배열: vector는 동적으로 크기가 조정되는 배열로 사용될 수 있습니다. 크기가 자동으로 조절되기 때문에 요소를 추가하거나 삭제하는 작업이 용이합니다. 예를 들어, 사용자로부터 입력받은 데이터를 동적으로 저장하고 관리할 때 vector가 유용합니다.
알고리즘과 함께 사용: vector는 다양한 알고리즘과 함께 사용될 수 있습니다. 정렬, 검색, 필터링 등과 같은 작업을 수행하는 알고리즘에서 vector는 데이터를 효율적으로 처리하는 데에 활용될 수 있습니다.
컨테이너의 기반 클래스로 사용: vector는 다른 컨테이너 클래스들의 기반 클래스로 사용될 수 있습니다. 예를 들어, stack, queue, list 등의 자료구조를 vector를 기반으로 구현할 수 있습니다.
vector는 C++ 표준 라이브러리에 포함된 다양한 멤버 함수와 기능을 제공하며, 메모리 관리와 크기 조정 등을 자동으로 처리해주므로 편리하게 사용할 수 있습니다. C++에서 vector를 사용하여 다양한 작업을 수행할 수 있으며, 유연성과 성능면에서 많은 장점을 제공합니다.
Q. clone이 뭐야?
clone()은 Java에서 객체의 복사를 수행하기 위해 사용되는 메서드입니다. 이 메서드를 호출하면 해당 객체의 얕은 복사(shallow copy)를 생성하여 반환합니다. 즉, 새로운 객체를 생성하고 원본 객체의 필드 값들을 복사합니다.
clone() 메서드를 사용하기 위해서는 복제하고자 하는 클래스가 Cloneable 인터페이스를 구현해야 합니다. Cloneable 인터페이스는 메서드가 없는 마커 인터페이스이며, 이를 구현함으로써 객체의 복제가 허용된다는 의미를 전달합니다. 만약 Cloneable 인터페이스를 구현하지 않은 클래스에서 clone() 메서드를 호출하면 CloneNotSupportedException 예외가 발생합니다.
clone() 메서드를 호출하여 객체를 복제할 때, 기본적으로 얕은 복사가 수행됩니다. 이는 복제된 객체와 원본 객체가 같은 참조를 공유하는 경우가 발생할 수 있음을 의미합니다. 따라서, 참조 타입의 필드가 있는 경우 해당 필드는 원본 객체와 복제 객체 모두가 동일한 객체를 참조하게 됩니다. 이러한 경우, 필요에 따라 깊은 복사(deep copy)를 수행하여 객체의 내부까지 복제해야 할 수 있습니다.
Java에서 clone() 메서드를 사용할 때 주의해야 할 몇 가지 사항이 있습니다:
clone() 메서드는 protected 접근 제어자를 가지고 있기 때문에, 외부에서 직접 호출할 수 없습니다. 따라서 clone() 메서드를 사용하려면 해당 클래스를 상속하여 public 접근 제어자로 오버라이딩해야 합니다.
clone() 메서드는 복제된 객체를 반환하므로, 반환값을 해당 클래스의 타입으로 캐스팅해야 합니다.
clone() 메서드로 생성된 복제 객체는 원본 객체와 독립적인 새로운 객체입니다. 필요에 따라 깊은 복사를 수행하여 객체의 내부까지 복제해야 할 수 있습니다.
clone() 메서드는 Object 클래스에 정의되어 있으므로 모든 Java 객체에서 사용할 수 있습니다. 하지만 Cloneable 인터페이스를 구현하지 않은 클래스에서 clone()을 호출하면 예외가 발생할 수 있습니다.
clone() 메서드를 사용하여 객체를 복제할 때에는 객체의 상태와 복제된 객체 사이의 일관성과 참조 관계를 주의깊게 다루어야 합니다. 또한, 복제 기능이 필요한 경우에는 복제 인터페이스와 메서드를 직접 정의하는 것이 더 안전하고 명확한 방법일 수 있습니다.
예)
class Person implements Cloneable {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
public class Main {
public static void main(String[] args) {
Person person1 = new Person("Alice", 25);
try {
// person1을 복제하여 person2를 생성
Person person2 = (Person) person1.clone();
// person1과 person2의 값을 출력
System.out.println("person1: " + person1.getName() + ", " + person1.getAge());
System.out.println("person2: " + person2.getName() + ", " + person2.getAge());
// person2의 이름과 나이를 변경
person2.setName("Bob");
person2.setAge(30);
// 변경 후 person1과 person2의 값을 출력
System.out.println("person1: " + person1.getName() + ", " + person1.getAge());
System.out.println("person2: " + person2.getName() + ", " + person2.getAge());
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
}
}
위의 예시에서는 Person 클래스를 정의하고 Cloneable 인터페이스를 구현했습니다. Person 클래스에는 name과 age 필드, 생성자, getter 메서드가 포함되어 있습니다.
main() 메서드에서는 Person 객체 person1을 생성한 후, clone() 메서드를 사용하여 person1을 복제하여 person2를 만듭니다. 이후, 각 객체의 값을 출력하고 person2의 이름과 나이를 변경한 후 다시 값들을 출력합니다.
실행 결과를 살펴보면, person1과 person2의 초기 값은 동일한 것을 알 수 있습니다. 이후 person2의 값이 변경되어도 person1은 변경되지 않습니다. 이는 clone() 메서드를 통해 복제된 객체들이 독립적으로 존재하기 때문입니다.
clone() 메서드는 Object 클래스에 정의되어 있으며, 기본적으로 얕은 복사를 수행합니다. 만약 Person 클래스에 참조 타입의 필드가 있다면, 해당 필드의 복사도 처리해주어야 합니다. 이를 위해서는 깊은 복사(deep copy)를 수행하거나, 필요에 따라 별도의 복사 로직을 구현해야 합니다.
또한, clone() 메서드를 사용할 때에는 CloneNotSupportedException을 처리해야 합니다. 이 예외는 Cloneable 인터페이스를 구현하지 않은 클래스에서 clone() 메서드를 호출할 때 발생할 수 있습니다.
참고로, Java에서 객체 복제를 위해 clone() 메서드 대신 복사 생성자(Copy Constructor)를 사용하는 것을 고려할 수도 있습니다. 복사 생성자는 객체의 복제를 더 명시적이고 직관적인 방법으로 처리할 수 있습니다.
'UIUX Full-Stack Developer' 카테고리의 다른 글
object / clone 개념 / class 조사 / object ** (0) | 2023.06.30 |
---|---|
[0629] 자바에 대한 모든 것 (0) | 2023.06.29 |
패턴 코드 분석 (0) | 2023.06.27 |
[0627] 풀스택 개발자 (0) | 2023.06.27 |
[방학 계획] 2023.06.27 ~ 2023.09.03 (0) | 2023.06.19 |