추상화와 동적 바인딩

kimsoapsoap's avatar
Aug 13, 2024
추상화와 동적 바인딩
 
 

1. 프로젝트 생성

java프로젝트를 생성해줍니다.
notion image
 
 
 
 

2. 객체 지향의 핵심

💡
객체는 상태와 행위를 가진다. 상태는 행위를 통해서만 변경한다. 상태는 멤버변수. 행위는 메서드이다. 멤버변수는 객체의 데이터로서 멤버변수를 직접 변경하는 것이 아니라 메서드를 통해서만 변경해준다.
 
class Alice { private int thirst; // private으로 데이터를 담는 멤버변수를 외부에서 접근 방지. public Alice(int thirst) { //객체 지향에서 변수의 값 초기화는 생성자에서 해준다. this.thirst = thirst; } void drink() { //setThirst() 대신 drink()를 사용했다. thirst 수치 조절. thirst = 0; } public int getThirst() { //thirst의 수치 확인 return thirst; } } public class Mem01 { public static void main(String[] args) { Alice e = new Alice(100); //생성시 thirst 값 100으로 초기화 //e.thirst = 100; //상태는 행위로 변경해야되므로 객체 지향이 아니다. 메서드로 변경해야됨 //thirst를 private으로 해놨기 때문에 다른 클래스인 Mem01에선 접근불가 //값 변경 (행위). 객체지향의 핵심이다. 상태(멤버변수)는 행위(메서드)로 변경해준다. e.drink(); //값 확인 int thirst = e.getThirst(); System.out.println(thirst); } }
 
 
 
 
2진수 10진수 변환 방법
변수의 존재 영역. static, heap, stack
 

3.추상화

💡
추상화의 핵심은 공통점을 기반으로 상위 개념을 정의하는 것입니다. 예를 들어, 여러 종류의 동물을 생각해 봅시다. 개, 고양이, 새 등 각각은 구체적인 동물입니다. 하지만 이들을 모두 "동물"이라는 상위 개념으로 묶을 수 있습니다. 이때 "동물"은 이들의 공통적인 특징(예: 먹는다, 소리를 낸다)을 표현하는 추상적인 개념입니다.

3-1. 추상화와 매개변수(파라미터)

추상화된 타입을 메서드의 매개변수로 사용할 수 있다는 점에서, 하나의 추상화된 타입으로 다양한 구체적인 객체를 처리할 수 있게 됩니다. 이는 코드의 유연성을 높이고, 다양한 객체가 동일한 방식으로 처리될 수 있게 해줍니다.
 
abstract class Animal { abstract void sound(); } class Dog extends Animal { @Override void sound() { System.out.println("Bark"); } } class Cat extends Animal { @Override void sound() { System.out.println("Meow"); } } public class Main { public static void makeSound(Animal animal) { // 추상화된 타입을 매개변수로 받음 animal.sound(); } public static void main(String[] args) { Dog dog = new Dog(); Cat cat = new Cat(); makeSound(dog); // Dog 객체 전달 makeSound(cat); // Cat 객체 전달 } }
추상화를 통해 코드를 더 유연하게 만들 수 있으며, 하나의 추상화된 타입으로 다양한 객체를 처리할 수 있게 됩니다. 이는 객체 지향 프로그래밍에서 다형성을 구현하는 중요한 기법으로, 코드의 재사용성과 유지보수성을 높이는 데 큰 기여를 합니다.
 
 
 
 
 

4. 동적 바인딩(Dynamic Binding)

💡
동적 바인딩은 메서드 호출 시점이 컴파일 타임이 아닌 런타임에 결정되는 방식을 의미합니다. 이는 객체의 실제 타입을 기반으로 메서드가 호출되도록 하여, 프로그램의 유연성과 다형성을 높여줍니다.
 
 

4-1. 메서드 오버라이딩(Method Overriding)

메서드 오버라이딩은 자식 클래스가 부모 클래스의 메서드를 재정의하는 것을 말합니다. 자식 클래스는 부모 클래스와 동일한 메서드 이름, 반환 타입, 매개변수를 가지는 메서드를 구현할 수 있으며, 이를 통해 부모 클래스의 메서드를 덮어씁니다. 오버라이딩된 메서드는 항상 동적 바인딩을 통해 실행됩니다. 이는 객체의 실제 타입에 따라 어떤 메서드가 호출될지 결정되기 때문입니다. 즉, 부모 클래스의 메서드를 호출하더라도, 자식 클래스에서 오버라이딩된 메서드가 존재하면 런타임 시 자식 클래스의 메서드가 호출됩니다.
 
 

4-2. 동적 바인딩과 메서드 오버라이딩의 관계

동적 바인딩은 메서드 오버라이딩을 효과적으로 활용하기 위해 필수적인 메커니즘입니다. 만약 정적 바인딩(Static Binding, 즉 컴파일 타임에 메서드가 결정되는 방식)이 적용된다면, 부모 클래스의 참조 변수를 통해 호출되는 모든 메서드는 부모 클래스의 메서드로 고정될 것입니다. 하지만 동적 바인딩 덕분에 실제 객체의 타입에 따라 올바른 메서드가 호출되므로, 자식 클래스에서의 메서드 오버라이딩이 의미 있게 동작할 수 있습니다.
 
 
 
class Parent { int x = 10; void A() { System.out.println("Parent's A"); } } class Child extends Parent { int y = 20; @Override void A() { System.out.println("Child's A"); } } public class Main { public static void main(String[] args) { Parent obj = new Child(); obj.A(); } }
컴파일 타임에는 obj가 Parent 타입이기 때문에 Parent 클래스의 A() 메서드가 호출될 것처럼 보일 수 있지만, 런타임에는 obj가 실제로 Child 객체를 참조하고 있으므로 Child 클래스의 A() 메서드가 호출됩니다. 이 메커니즘이 바로 동적 바인딩입니다. 즉, 컴파일 시점에는 참조 변수의 타입(이 경우 Parent)에 따라 메서드를 선택할 수 있지만, 실제로 어떤 메서드를 호출할지는 런타임에 참조되는 객체(Child)의 타입에 따라 결정된다
Share article

zerfa