

메모리에 대해서 자바에서 메모리는 무엇인가?
new Dog("포키");
코드는 Dog 클래스를 기반으로 새로운 객체를 생성하는 부분입니다.
여기서 "포키"는 생성자 Dog(String name)에 전달되는 매개변수로,
생성되는 Dog 객체의 name 필드를 초기화하는 데 사용됩니다.
이 코드를 실행하면, 먼저 Dog 클래스에 따라 메모리가 할당됩니다.
이 메모리 공간은 Dog 객체를 저장하기 위한 공간으로, Dog 클래스에 정의된 필드와 메서드 정보를 담게 됩니다.
그러고 나서 매개변수 "포키"는 Dog 생성자에 전달되어,
할당된 메모리 공간에 있는 name 필드를 초기화합니다.
즉, "포키"라는 값이 name 필드에 저장됩니다.
따라서, 매개변수 "포키" 자체가 메모리를 의미하는 것은 아닙니다.
대신, "포키"는 Dog 객체가 메모리에 생성될 때 name 필드를 초기화하는 데 사용되는 값입니다.
1. Dog 클래스에 기반하여 메모리 할당 -> new Dog(...)
2. 생성자에 매개변수 "포키" 전달 -> new Dog("포키")
3. 매개변수를 사용해 name 필드 초기화
4. 초기화된 Dog 객체(인스턴스) 생성
이렇게 생성된 Dog 객체는 myDog라는 변수를 통해 참조하고 사용할 수 있습니다.
"생성자 호출"과 "매개변수 전달"에 대해서 이해하기
생성자 호출: Dog myDog = new Dog("포키"); 이 부분에서 new Dog("포키")가 Dog 클래스의 생성자를 호출하는 부분입니다. new 키워드 다음에 오는 Dog("포키")는 Dog 클래스의 생성자를 호출하고, "포키"라는 매개변수를 전달하는 역할을 합니다.
매개변수 전달: "포키"라는 문자열이 Dog 클래스의 생성자에 전달되는 매개변수입니다. new Dog("포키")에서 "포키" 부분이 이에 해당합니다.
전달된 부분 처리: public Dog(String name) 이 부분은 Dog 클래스의 생성자를 정의하는 부분입니다. 여기서 String name은 생성자의 매개변수를 정의하며, 이 매개변수는 생성자가 호출될 때 전달된 "포키" 값을 받아 name 필드를 초기화하는 데 사용됩니다.
이를 도식화하면 다음과 같습니다:
1. Dog 클래스의 인스턴스 생성 요청 -> Dog myDog = new Dog("포키");
2. Dog 클래스의 생성자 호출 및 매개변수 "포키" 전달 -> new Dog("포키");
3. 생성자에서 매개변수를 받아 필드 초기화 -> public Dog(String name) { this.name = name; }
4. 초기화된 Dog 객체 생성
이렇게 생성자를 통해 객체의 필드를 초기화하는 방법은 객체 지향 프로그래밍에서 객체를 생성하고 초기 상태를 설정하는 데 널리 사용됩니다.
Final 객체와 불변객체란 무엇인가?
'불변'이라는 용어는 객체의 상태가 한 번 설정된 후에는 변경되지 않는다는 것을 의미합니다.
즉, 불변 객체는 생성될 때 할당된 값이 그 이후로 변경되지 않습니다.
자바에서는 final 키워드를 사용하여 불변 필드를 정의할 수 있습니다.
final 키워드가 붙은 필드는 한 번 초기화되면 그 값을 변경할 수 없습니다.
이런 특성 때문에 불변 객체는 안전하고 예측 가능하다는 장점이 있습니다.
다음은 final 키워드를 사용하여 불변 필드를 가진 클래스의 예입니다.
java
public class ImmutableDog {
private final String name;
public ImmutableDog(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
이 코드에서 ImmutableDog 클래스의 name 필드는 final 키워드로 선언되어 있어, 한 번 "포키" 등의 값으로 초기화되면 그 이후로는 값을 변경할 수 없습니다. 따라서 이 name 필드는 불변 필드입니다.
이와 반대로, 불변성이 없는 필드는 값을 자유롭게 변경할 수 있습니다.
이런 필드는 상황에 따라 다양한 값을 가질 수 있으므로 더 유연하지만, 예기치 않은 변경으로부터 안전하지 않을 수도 있습니다.
인터페이스(Interface)와 타입은 무엇인가?
인터페이스(Interface)는 클래스나 프로그램이 따라야 하는 '계약' 또는 '표준'을 정의하는데 사용됩니다.
인터페이스는 메소드와 상수만을 가질 수 있으며, 모든 메서드는 추상 메서드입니다(즉, 메서드 본문이 없으며 선언만 있습니다). 클래스가 인터페이스를 구현(Implements)하면 그 클래스는 인터페이스에서 정의한 모든 메서드를 구현해야 합니다.
추상화(Abstraction)는 복잡한 시스템을 간단하게 표현하는 프로세스입니다.
클래스와 인터페이스는 추상화의 핵심 도구입니다. 클래스는 객체의 상태(필드)와 행동(메소드)을 캡슐화하며,
인터페이스는 클래스가 따라야 하는 행동을 정의합니다.
인터페이스를 구현하는 클래스를 참조 변수의 타입으로 사용하는 과정은 다음과 같습니다:
인터페이스를 정의합니다. 이 인터페이스는 하나 이상의 추상 메소드를 선언합니다.
java
public interface Pet {
void makeSound();
}
인터페이스를 구현하는 클래스를 정의합니다.
이 클래스는 인터페이스에서 선언한 모든 메소드를 구현해야 합니다.
java
public class Dog implements Pet {
public void makeSound() {
System.out.println("Woof!");
}
}
이제 인터페이스 타입의 변수를 선언하고, 해당 인터페이스를 구현한 클래스의 객체를 생성하여 할당할 수 있습니다.
java
Pet myPet = new Dog();
이 코드는 myPet 변수가 Pet 인터페이스를 구현하는 모든 객체(Dog, Cat, Bird 등)를 참조할 수 있음을 의미합니다. 이를 통해 다형성을 실현할 수 있습니다. 즉, myPet.makeSound(); 코드는 myPet이 참조하는 객체의 타입에 따라 다른 결과를 출력할 수 있습니다.
상수, 추상 메서드, 디폴트 메서드, 정적 메서드는 무엇인가?
인터페이스는 다음과 같은 종류의 멤버를 가질 수 있습니다
상수: 인터페이스에서는 상수 필드만 선언이 가능합니다. 이는 일반 변수 선언이 불가능하다는 것을 의미합니다. 상수는 public static final 키워드를 사용하여 선언되며, 이 키워드는 생략 가능합니다 1.
예를 들어,
인터페이스에서 double PI = 3.14;라고 선언하면, 이는 public static final double PI = 3.14;와 동일한 의미가 됩니다1.
추상 메소드: 인터페이스의 주요 구성 요소로, 이 메서드들은 선언만 있고 구현 부분이 없습니다. 이 메서드들은 public abstract 키워드를 사용하여 선언되며, 이 키워드는 생략 가능합니다 1. 따라서 인터페이스에서 void method();를 정의하면, 이는 public abstract void method();인 추상 메서드가 됩니다 1.
디폴트 메소드 (Java 8 이상): 디폴트 메서드는 실행 블록을 가지고 있으며, default 키워드를 반드시 명시해야 합니다 1. 디폴트 메서드는 인터페이스를 구현하는 클래스에서 오버라이드할 수 있지만, 오버라이드하지 않아도 에러가 발생하지 않습니다 1.
정적 메소드 (Java 8 이상): 정적 메서드 또한 실행 블록을 가지고 있으며, static 키워드를 명시해야 합니다 1. 정적 메서드는 인터페이스 이름으로 직접 호출할 수 있습니다 1.

'컴퓨터공부 > 책리뷰 & book review' 카테고리의 다른 글
스프링 입문을 위한 자바 객체 지향의 원리와 이해 (8)[책리뷰 & Book review] (0) | 2024.02.11 |
---|---|
스프링 입문을 위한 자바 객체 지향의 원리와 이해 (7)[책리뷰 & Book review] (0) | 2024.02.11 |
Do it! 알고리즘 입문: 자바 편 (27)[책리뷰 & Book review] (0) | 2024.02.06 |
Do it! 알고리즘 입문: 자바 편 (26)[책리뷰 & Book review] (0) | 2024.02.06 |
댓글