개발 코딩 정보 공유/코드와트 코딩강의

코딩강의6화 - flutter dart 앱개발 상속, 확장에 대해서 with gpt

코드와트 2025. 3. 14. 15:07
반응형

 

 

 

 

https://youtu.be/vnM2J-Bagb0

*아래의 글은 유튜브 코드와트 채널에서 연재되는 강의를 글로 작성한 내용입니다. 

*대화형식으로 진행되며, ai chat GPT를 활용한 코딩이 핵심입니다.

*시대에 맞게 코딩.개발의 조력자로써 ai를 잘 활용것이 목표입니다.

 

 

 

안녕하세요. 코드와트입니다.

오늘은 확장에 대해서 알아보겠습니다.

확장(extends), 상속(Inheritance)

현대의 대부분의 언어들은 extends 확장(또는 상속) 이라고 하는 기능을 가지고 있습니다.

확장은 말그대로 기존의 것을 가지고 확대, 확장 한다는 의미가 있습니다.

사전을 살펴 보겠습니다

 

 

 

 

사전을 찾아보니 우리가 오늘 해야할 일이 무엇인지 명확해 집니다.

우선 실행해보죠.

 

class A {
	var name = 'A';
	void testFunc(){
		print('클래스 A 테스트 입니다.');
	}
}

class B extends A {
	@override
	var name = 'B';

	@override
	void testFunc(){
		print('클래스 B 테스트 입니다.');
	}

}

main (){
	var b = B();
	b.testFunc();
  
}

 

 

A 라는 클래스, B라는 클래스가 있습니다.

B 클래스를 만들때 extends A 라는 키워드가 보입니다. 눈치 채셨겠지만 이게 부분이 바로 오늘 배울 확장(상속) 키워드를 사용하는 부분입니다. extends A 라고 명시하면 A에 있는 변수, 함수등을 B에서 가져다 사용할수 있는것이죠. B를 다시 보니 특이한게 보입니다. 바로 override 라고 하는 키워드 입니다.

 

 

 

 

override 는 기존의 A라는 클래스에 작성된 name, testFunc 를 가져와서 B에서 새롭게 구현하는것을 말합니다.

 

이것을 재정의 한다.

라고 말합니다.

 

즉 A 라는 클래스에 정의된 변수명과 함수명을 가져와서 B에 상황에 맞게 재정의하여 사용한다. 라는 말입니다. 물론 재정의 하지 않고, 그대로 A의 기능을 물려(사용)받을수도 있습니다.

 

🙋‍♀️ “물려받는다고요?”

 

우리가 확장이라고 썻지만, 다른 관점에서 상속이라는 말로 표현하기도 합니다. extends 라는 키워드를 통해서 만들어지는 A-B의 관계가 마치 부모(Super)-자식(Sub) 간의 관계가 형성되는것 처럼 보이기 때문입니다.

 

 

🙋‍♀️ ”쌤 상속? 확장??? … 부모-자식관계는 또 뭐죠?”

 

 

네 이해하기에 어려운 내용이 맞습니다.

이번에도 gpt 를 통해서 자세하게 한번 알아볼께요.

 

 

 

 

B라는 클래스는 A 클래스를 extends 함으로써 클래스의 재사용성이 올라갑니다. 쉽게 말해서 똑같은 기능을 하는 코드를 여기저기 만들지 말고 extends를 통해 기존의 기능을 사용하거나, 확장하는 형태로 만들어 나갈수 있는것이죠.

이제부터는 좀더 이해를 돕기위해 동물들을 빗대어 작성해볼께요.

개와 고양이는 동물입니다. 그리고 숨쉬기를 하고있죠.

만약 확장의 기능이 없다면 이런식의 중복 되는 기능들이 많아질수 있겠죠.

 

class Dog{

	void breathe(){
		print('숨쉬기...');
	}
}

class Cat{

	void breathe(){
		print('숨쉬기...');
	}
}

 

class Animal{
	void breathe(){
		print('숨쉬다...');
	}
}

class Dog extends Animal{
}

class Cat extends Animal{
}

 

확장의 기능을 사용하면 Dog, Cat 친구들에게 굳이 또 숨쉬는 기능을 만들어줘야 할 필요가 없습니다.

Animal 이라고 하는 부모(super) 로 부터 숨쉬는 기능을 물려받고 사용하기만 되죠.

여기서 Dog와 Cat은 자연스럽게 Animal의 자식(Sub)이 되는거죠.

 

main(){
	var dog = Dog();
	var cat = Cat();
	dog.breathe();
	cat.breathe();

}

 

 

자 여기서 개와 고양이만의 각각 고유한 숨쉬기 방법을 부여해보겠습니다.

여기서 필요한것이 바로 override(재정의) 라는 키워드 입니다.

기존의 부모클래스인 Animal 은 고칠필요가 없구요.

개와 고양이에서 각각의 숨쉬기 방법을 정의해 보겠습니다.

 

class Dog extends Animal{
	@override
	void breathe(){
		print('개의 숨소리');
	}
}

class Cat extends Animal{
	@override
	void breathe(){
		print('고양이의 숨소리');
	}
}

 

제 마음대로 정의한 숨쉬기 방법이니, 이부분은 심각하게 생각하지 말아주세요. 그게 중요한게 아닙니다.

전체 코드를 보고 실행해 보겠습니다.

 

class Animal{
	void breathe(){
		print('숨쉬다...');
	}
}

class Dog extends Animal{
	@override
	void breathe(){
		print('개의 숨소리');
	}
}

class Cat extends Animal{
	@override
	void breathe(){
		print('고양이의 숨소리');
	}
}

main(){
	var dog = Dog();
	var cat = Cat();
	dog.breathe();
	cat.breathe();
}

 

어떤가요? 개와 고양이만에 숨쉬는 방법이 만들어졌습니다.

몇가지 더 만들어보겠습니다. 새를 만들어 볼께요.

 

class Bird extends Animal{
	@override
	void breathe(){
		print('새의 숨소리');
	}
}

 

새를 만들었으니 main 함수에도 추가해줍니다.

 

main(){
	var dog = Dog();
	var cat = Cat();
	var bird = Bird();
	dog.breathe();
	cat.breathe();
	bird.breathe();
}

 

 

🤦‍♂️ ”오… 그러면 동물들이 많아질수록 모든 코드를 다 작성하고 실행해야 되나요?”

 

맞습니다. 동물들이 많아질수록 당연히 코드작성이 많아지게 됩니다.

이번에는 좀 더 유연하게 대처해보겠습니다. 함수를 하나 만들어 보겠습니다.

이 함수는 매개변수(Parameter)로 Animal 타입(부모)을 전달받고 (숫자와 문자만 전달할수 있는게 아닙니다.)

animal 클래스에 작성된 breathe를 사용하는 간단한 함수입니다.

AnimalBreathe 라는 임의의 클래스를 만들고

그안에 Dog, Cat의 부모인 Animal 타입을 매개변수로 받는 breathe 함수를 만들어줬습니다.

 

class AnimalBreathe(){
	void breathe(Animal animal){ 👈
		animal.breathe();
	}
}

 

 

AnimalBreathe 라고 하는 모든 동물의 숨쉬기 실행자를 생성하고 Dog 를 생성했습니다. 그리고 나서 dog 를 breathe를 호출할때 같이 전달해주었습니다.

 

main(){
	var animalBreathe = AnimalBreathe();
	var dog = Dog();
	
	animalBreathe.breathe(dog); 👈
}

 

전체코드입니다.

 

class Animal{
	void breathe(){
		print('숨쉬다...');
	}
}

class Dog extends Animal{
	@override
	void breathe(){
		print('개의 숨소리');
	}
}

class Cat extends Animal{
	@override
	void breathe(){
		print('고양이의 숨소리');
	}
}

class AnimalBreathe{
	void breathe(Animal animal){
		animal.breathe();
	}
}

main(){
	var animalBreathe = AnimalBreathe();
	var dog = Dog();
	var cat = Cat();
	
	animalBreathe.breathe(dog);
	animalBreathe.breathe(cat);
}

 

이렇게 함으로써 breathe 라는 숨쉬는 기능을 각각의 동물별로 구분하여 직접 실행해줄 필요없이 어떤동물을 만들던 그저 animalBreathe (위임) 의 함수에 전달하는것 만으로 각 동물들의 고유한 숨소리가 작동하게 되었습니다.

단순한 구문이지만 사실 여기에는 상속, 다형성, 업캐스팅 등 많은 지식들이 복합적으로 결합된 결과물 입니다.

아쉽지만 이부분은 뒤에서 좀더 자세하게 살펴보겠습니다.

 

반응형