-

클래스는 상속 ㅇㅇ 구조체는 ㄴㄴ


저장된 프로퍼티 stored property

3번이 제일 일반적인 방법임

클래스를 만들면 아무런 기능이 없지만 일단 init가 자동으로 만들어진다

🧩 1️⃣ C (구조체 + 함수로 유사 구현)
C언어는 클래스 개념이 없기 때문에
객체지향 언어처럼 직접 메서드를 정의할 수 없음.
하지만 “구조체 + 함수 포인터”를 사용해서 비슷하게 구현할 수 있음.#include <stdio.h> struct Person { char name[20]; int age; void (*introduce)(struct Person); }; void introduce(struct Person p) { printf("안녕하세요. 제 이름은 %s이고, 나이는 %d입니다.\n", p.name, p.age); } int main() { struct Person p1 = {"수인", 24, introduce}; p1.introduce(p1); return 0; }✅ 설명
- struct는 데이터(속성)를 묶는 구조체.
- 함수 포인터(void (*introduce)(struct Person))로 “메서드처럼” 동작하게 함.
- 객체지향 언어처럼 p1.introduce() 형태로 호출 가능.
🧩 2️⃣ C++ (클래스 메서드 정식 지원)
#include <iostream> using namespace std; class Person { public: string name; int age; void introduce() { cout << "안녕하세요. 제 이름은 " << name << "이고, 나이는 " << age << "입니다." << endl; } }; int main() { Person p1; p1.name = "수인"; p1.age = 24; p1.introduce(); }✅ 설명
- class 안에 변수(속성)와 함수(메서드)를 정의.
- p1.introduce()처럼 객체를 통해 메서드 호출.
- this 키워드로 자기 자신 참조 가능 (this->name).
🧩 3️⃣ Java (클래스 기반 대표 언어)
public class Person { String name; int age; void introduce() { System.out.println("안녕하세요. 제 이름은 " + name + "이고, 나이는 " + age + "입니다."); } public static void main(String[] args) { Person p1 = new Person(); p1.name = "수인"; p1.age = 24; p1.introduce(); } }✅ 설명
- class 안에 필드 + 메서드로 구성.
- static이 없으면 인스턴스 메서드 (객체를 만들어야 호출 가능).
- static이 붙으면 클래스 메서드 (객체 없이 호출 가능):
-
static void sayHello() { System.out.println("Hello!"); } Person.sayHello();
🧩 4️⃣ Swift (iOS 개발 언어)
class Person { var name: String var age: Int init(name: String, age: Int) { self.name = name self.age = age } func introduce() { print("안녕하세요. 제 이름은 \(name)이고, 나이는 \(age)입니다.") } class func sayHello() { print("안녕하세요! 반갑습니다.") } } let p1 = Person(name: "수인", age: 24) p1.introduce() Person.sayHello()✅ 설명
- func로 메서드 정의.
- init()은 생성자(초기화 함수).
- func → 인스턴스 메서드
- class func → 클래스 메서드 (static func도 가능하지만 오버라이드 불가)
🧩 5️⃣ Python (간결하고 직관적)
class Person: def __init__(self, name, age): self.name = name self.age = age def introduce(self): # 인스턴스 메서드 print(f"안녕하세요. 제 이름은 {self.name}이고, 나이는 {self.age}입니다.") @classmethod def say_hello(cls): # 클래스 메서드 print("안녕하세요! 반갑습니다.") p1 = Person("수인", 24) p1.introduce() Person.say_hello()✅ 설명
- self: 인스턴스 자신
- cls: 클래스 자신 (클래스 메서드용)
- @classmethod 데코레이터 사용 시 인스턴스 없이 호출 가능
- @staticmethod는 클래스·인스턴스 상관없이 호출 가능


시험에 많이 냄

🧩 3️⃣ 언어별 예시 비교
✅ Java (this)
public class Person { String name; int age; public Person(String name, int age) { this.name = name; // 멤버변수와 매개변수 구분 this.age = age; } void introduce() { System.out.println("안녕, 나는 " + this.name + "이야!"); } }✅ C++ (this)
#include <iostream> using namespace std; class Person { public: string name; int age; Person(string name, int age) { this->name = name; this->age = age; } void introduce() { cout << "안녕, 나는 " << this->name << "이야!" << endl; } };this는 현재 객체의 포인터(this pointer)
→ 내부적으로 this->변수, (*this).변수와 동일✅ Swift (self)
class Person { var name: String var age: Int init(name: String, age: Int) { self.name = name self.age = age } func introduce() { print("안녕, 나는 \(self.name)이야!") } }🧩 4️⃣ 차이점 요약
구분thisself사용 언어 Java, C++, C#, JS 등 Python, Swift, Objective-C 전달 방식 컴파일러가 자동 전달 명시적으로 첫 인자로 전달 (Python) 형태 예약어(keyword) 일반 변수 이름(convention) 접근 방법 this.name, this->name self.name 생성자 호출 this()로 다른 생성자 호출 self.init() (Swift) 오버라이드 시 구분 this.method() self.method() 가리키는 대상 현재 객체 (instance) 현재 인스턴스 또는 타입(Self 타입)
🧩 5️⃣ 핵심 요약 정리 문장
🔹 this와 self는 모두 “현재 객체 자신”을 가리킨다.
🔹 this는 자동으로 전달되는 예약어,
🔹 self는 명시적으로 선언해야 하는 첫 번째 매개변수(파이썬) 혹은
현재 인스턴스를 가리키는 참조(Swift)
🔹 즉, “객체 자신에 접근하기 위한 키워드”라는 점은 같다.
designated initializer
지정하다

iOS에서 가장 자주 사용하는 UIImage 활용법 TOP 5만
핵심 위주로 깔끔하게 정리해줄게 — 실무, 과제, 앱개발 다 커버 가능 ✅
🧩 1️⃣ Assets 이미지 불러오기
가장 기본이자 가장 자주 쓰는 방법.
let image = UIImage(named: "profile") imageView.image = image💡 설명
- "profile"은 Assets.xcassets에 있는 이미지 이름
- UIImageView, UIButton, UIImageSymbolConfiguration 등에 넣어 사용
- 앱 리소스 이미지를 표시할 때 거의 100% 사용됨
🧩 2️⃣ 시스템 아이콘(SF Symbols) 사용
iOS 내장 아이콘을 쉽게 쓸 때.
let image = UIImage(systemName: "heart.fill") imageView.image = image💡 설명
- "heart.fill" 같은 SF Symbol 이름 사용
- 색상 변경도 간단함👇
-
imageView.tintColor = .red
- 버튼, 탭바, 네비게이션바 등에서도 많이 씀
🧩 3️⃣ URL(웹 이미지) 불러오기
인터넷 이미지 다운로드할 때 — 실무에서도 진짜 자주 사용됨.
if let url = URL(string: "https://example.com/image.png"), let data = try? Data(contentsOf: url) { let image = UIImage(data: data) imageView.image = image }💡 설명
- 단순 예제는 이렇게 동기식(try? Data)으로 가능하지만,
- 실제 앱에서는 비동기 다운로드 필수 👇
-
URLSession.shared.dataTask(with: url) { data, _, _ in if let data = data, let image = UIImage(data: data) { DispatchQueue.main.async { imageView.image = image } } }.resume()
🧩 4️⃣ UIImage → Data (이미지 저장/전송)
서버 업로드나 로컬 저장 시 많이 씀.
if let image = UIImage(named: "profile") { if let data = image.jpegData(compressionQuality: 0.8) { // data를 서버 전송 or 파일 저장 가능 } }💡 설명
- .jpegData(compressionQuality:) → JPG 형식 변환
- .pngData() → PNG 형식 변환
- 변환된 Data를 FileManager, URLSession 등으로 전송 가능
🧩 5️⃣ Data → UIImage (이미지 표시)
서버에서 받은 Data를 다시 이미지로.
let image = UIImage(data: imageData) imageView.image = image💡 설명
- 서버 응답이 이미지일 경우 (예: Base64 decode, URLSession response 등)
- 이건 3번(URL 불러오기)과 세트로 자주 등장함
⚙️ 보너스: UIImage 활용 패턴 정리
상황코드설명기본 이미지 불러오기 UIImage(named:) Assets 이미지 시스템 아이콘 UIImage(systemName:) SF Symbols Data로부터 UIImage(data:) 서버/파일 이미지 파일 경로로부터 UIImage(contentsOfFile:) 로컬 파일 크기 변경 image.resize(to:) (extension 구현 필요) 썸네일 등 색상 변경 withTintColor(_:) 아이콘 컬러 변경 회전/자르기 Core Graphics 사용 고급 이미지 처리
🧩 SwiftUI에서 UIImage 쓰는 경우
UIKit의 UIImage를 SwiftUI에서 표시하려면 이렇게 변환해.
Image(uiImage: UIImage(named: "profile")!) .resizable() .scaledToFit()💡 설명
- SwiftUI의 Image는 UIKit 이미지도 받을 수 있음 (uiImage: 초기화)
- URL 이미지는 async 로드 후 UIImage(data:) 로 변환해서 전달 가능
🧾 정리 문장
✅ UIImage(named:),
✅ UIImage(systemName:),
✅ UIImage(data:),
✅ jpegData() / pngData(),
✅ URLSession으로 비동기 로드
이 5가지가 가장 많이 사용되는 UIImage 패턴이다.
→ 즉, "앱 내 리소스 표시", "서버 이미지 로드", "업로드" 3가지가 핵심 흐름임.Swift에서 init(이니트)은 바로 **생성자(initializer)**야.
즉, 클래스나 구조체의 인스턴스를 만들 때 값을 초기화해주는 특별한 메서드야.
그럼 단계별로 아주 쉽게 정리해볼게👇
🧩 1️⃣ init = 생성자 (Initializer)
Swift에서는 객체를 만들 때 **변수(프로퍼티)**에 초기값을 넣어줘야 하는데,
그걸 해주는 함수가 바로 **init**이야.class Person { var name: String var age: Int init(name: String, age: Int) { // 생성자 self.name = name self.age = age } } let p1 = Person(name: "수인", age: 24)💡 해석
- init은 Person()이 호출될 때 자동 실행되는 초기화 함수
- self.name은 현재 객체의 name 속성을 의미함
- name: 과 age: 는 매개변수(parameter)
🧩 2️⃣ self는 왜 쓰냐?
self는 “이 객체 자신”을 의미해.
name이라는 변수명이 매개변수랑 속성 이름이 같을 때
구분하려고 self.name이라고 씀.self.name = name // 왼쪽은 객체의 속성, 오른쪽은 init() 매개변수
🧩 3️⃣ init? 물음표(옵셔널 초기화)
물음표(?)가 붙은 init?은 실패할 수도 있는 생성자야.
즉, “조건에 따라 객체를 만들 수 없을 수도 있다”는 뜻.class Student { var name: String var score: Int init?(name: String, score: Int) { if score < 0 { // 점수가 음수면 잘못된 데이터 return nil // ❌ 초기화 실패 → 객체 생성 안 됨 } self.name = name self.score = score } } if let s1 = Student(name: "수인", score: 90) { print("✅ 생성 성공: \(s1.name)") } else { print("❌ 생성 실패") } let s2 = Student(name: "수인", score: -10) // nil (생성 실패)💡 정리
- init? → “실패 가능 생성자 (failable initializer)”
- 조건이 맞지 않으면 nil 반환
- 즉, 생성 결과 타입이 Student? (옵셔널 객체)
🧩 4️⃣ 물음표가 붙는 이유
Swift는 **안정성(safety)**을 중요시하기 때문에
“객체를 항상 안전하게 만들 수 없는 경우”엔 **옵셔널(?)**로 처리해야 함.👉 예를 들어:
- 잘못된 파일 이름 (UIImage(named:))
- 음수 나이
- JSON 디코딩 실패
이런 건 항상 실패할 가능성이 있으니까 ?로 표시함.
🧩 5️⃣ 정리표
구분문법설명결과일반 생성자 init() 항상 성공 객체 생성됨 실패 가능 생성자 init?() 조건 맞지 않으면 실패 nil 반환 가능 암시적 옵셔널 생성자 init!() 실패 시 런타임 에러 발생 위험, 잘 안 씀
🧩 6️⃣ 예시 비교
// 일반 init let person1 = Person(name: "수인", age: 24) // 항상 성공 // 실패 가능한 init? let student1 = Student(name: "민지", score: 100) // ✅ 생성됨 let student2 = Student(name: "민지", score: -10) // ❌ nil (생성 실패)
🧾 한 줄 요약
🔹 init = 객체를 만들 때 초기화해주는 생성자 함수
🔹 init? = “조건에 따라 객체 생성이 실패할 수도 있음” → nil 반환 가능
🔹 Swift는 이런 “안전한 초기화”를 위해 ?를 붙여 옵셔널 생성자를 제공함



시험에 나옴 좋아 👍 완전히 처음부터 Swift에서 UI 클래스를 사용하는 방법을
정리해줄게.여기서 말하는 “UI 클래스”란 UILabel, UIButton, UIImageView, UITextField,
UIView, UITableView, UICollectionView 같은 UIKit의 화면 구성 요소들이야.
🧩 Swift에서 UI 클래스를 사용하는 3가지 기본 방법
구분방식특징① Storyboard / Interface Builder 마우스로 UI 배치하고 @IBOutlet, @IBAction으로 연결 ② 코드로 직접 UI 작성 (Code-based UI) 코드로 UI 요소를 만들고 위치 잡음 (AutoLayout 사용) ③ SwiftUI 사용 선언형 문법으로 UI와 로직을 통합 (UIKit 대체 기술)
🧩 1️⃣ Storyboard로 UI 클래스 사용하는 방법 (가장 전통적인 방식)
✅ 예시
import UIKit class ViewController: UIViewController { @IBOutlet weak var titleLabel: UILabel! @IBOutlet weak var mainButton: UIButton! override func viewDidLoad() { super.viewDidLoad() titleLabel.text = "안녕하세요!" mainButton.setTitle("시작하기", for: .normal) } @IBAction func buttonTapped(_ sender: UIButton) { titleLabel.text = "버튼 눌림!" } }💡 설명
- @IBOutlet → Storyboard에 있는 UI와 연결 (IBOutlet = Interface Builder Outlet)
- @IBAction → 버튼 클릭 같은 이벤트를 처리하는 메서드
- StoryBoard에서 Control + 드래그로 연결함
- 초보자 / 학교 과제 / 간단 앱에서 가장 많이 쓰임
🧩 2️⃣ 코드로 직접 UI 만드는 방법 (Storyboard 안 쓰는 방식)
✅ 예시
import UIKit class ViewController: UIViewController { let titleLabel = UILabel() let mainButton = UIButton(type: .system) override func viewDidLoad() { super.viewDidLoad() // Label titleLabel.text = "안녕하세요!" titleLabel.textAlignment = .center titleLabel.font = UIFont.systemFont(ofSize: 24) titleLabel.translatesAutoresizingMaskIntoConstraints = false view.addSubview(titleLabel) // Button mainButton.setTitle("눌러보기", for: .normal) mainButton.translatesAutoresizingMaskIntoConstraints = false mainButton.addTarget(self, action: #selector(buttonTapped), for: .touchUpInside) view.addSubview(mainButton) // AutoLayout 제약 NSLayoutConstraint.activate([ titleLabel.centerXAnchor.constraint(equalTo: view.centerXAnchor), titleLabel.centerYAnchor.constraint(equalTo: view.centerYAnchor, constant: -40), mainButton.centerXAnchor.constraint(equalTo: view.centerXAnchor), mainButton.topAnchor.constraint(equalTo: titleLabel.bottomAnchor, constant: 20) ]) } @objc func buttonTapped() { titleLabel.text = "버튼이 눌렸어요!" } }💡 설명
- UI를 코드로 완전히 제어 → 유연함 & 협업에 강함
- translatesAutoresizingMaskIntoConstraints = false → AutoLayout 수동 설정
- 실무에서 점점 많이 쓰이는 방식 (특히 MVVM, Clean Architecture 구조)
🧩 3️⃣ SwiftUI로 UI 사용하는 방법 (최신 방식)
✅ 예시
import SwiftUI struct ContentView: View { @State private var text = "안녕하세요!" var body: some View { VStack(spacing: 20) { Text(text) .font(.title) Button("눌러보기") { text = "버튼 눌림!" } } } }💡 설명
- SwiftUI는 UIKit보다 간단하고 선언적(Declarative)
- @State로 값이 바뀌면 UI가 자동으로 업데이트
- iOS 13 이상에서만 사용 가능
- UIKit의 UILabel, UIButton 대신 Text, Button 등 사용
🧩 4️⃣ UI 클래스 자주 쓰는 패턴
UI 클래스역할자주 쓰는 속성UILabel 텍스트 표시 .text, .font, .textColor, .textAlignment UIButton 버튼 클릭 이벤트 .setTitle(), .addTarget(), .tintColor UIImageView 이미지 표시 .image, .contentMode UITextField 한 줄 입력 .text, .placeholder, .delegate UITextView 여러 줄 입력 .text, .font, .isEditable UIView 기본 컨테이너 .backgroundColor, .addSubview()
🧩 5️⃣ UIKit과 SwiftUI 함께 쓰기 (호환)
UIKit 프로젝트 안에서도 SwiftUI View를 쓸 수 있음 👇
import SwiftUI import UIKit struct SwiftUIView: View { var body: some View { Text("SwiftUI 뷰") } } class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() let child = UIHostingController(rootView: SwiftUIView()) addChild(child) view.addSubview(child.view) child.view.frame = view.bounds child.didMove(toParent: self) } }
🧾 정리 한줄 요약
✅ Storyboard 방식: 초보자용, 드래그로 연결
✅ 코드로 UI 구성: 실무용, 유연하고 재사용성 높음
✅ SwiftUI 방식: 최신, 선언형, 코드가 짧음



🧩 1️⃣ super의 기본 개념
🔹 super는 “부모 클래스(superclass)” 를 가리키는 키워드야.
즉, 상속 관계에서 자식 클래스가 부모 클래스의 기능(메서드, 속성, 생성자 등)을 사용할 때 쓰는 예약어.
🧩 2️⃣ super가 하는 역할 요약
용도설명예시① 부모 클래스의 메서드 호출 super.method() ② 부모 클래스의 생성자(초기화) 호출 super() 또는 super.init() ③ 부모 클래스의 속성 접근 super.property
🧩 3️⃣ 언어별 사용 예시
✅ Swift에서의 super
class Animal { func speak() { print("동물이 소리를 냅니다.") } } class Dog: Animal { override func speak() { super.speak() // 부모의 speak() 호출 print("멍멍!") } init(name: String) { super.init() // 부모 생성자 호출 (필요한 경우) print("\(name) 생성 완료") } } let dog = Dog(name: "바둑이") // 출력: // 동물이 소리를 냅니다. // 멍멍! // 바둑이 생성 완료💡 설명
- super.speak() → 부모(Animal)의 speak() 먼저 실행
- super.init() → 부모 생성자(초기화) 호출
- Swift에서 상속 관계가 있을 때만 사용 가능 (class 전용)
✅ Java에서의 super
class Animal { void speak() { System.out.println("동물이 소리를 냅니다."); } } class Dog extends Animal { @Override void speak() { super.speak(); // 부모의 메서드 호출 System.out.println("멍멍!"); } Dog() { super(); // 부모 생성자 호출 System.out.println("Dog 객체 생성됨"); } } public class Main { public static void main(String[] args) { new Dog(); } }💡 설명
- super()는 부모 클래스 생성자 호출 (생성자 첫 줄에 반드시 위치해야 함)
- super.speak()는 부모 메서드 실행
- this는 자기 자신 / super는 부모 클래스 구분용
✅ C++에서의 super (직접 키워드는 없고 BaseClass::로 사용)
#include <iostream> using namespace std; class Animal { public: void speak() { cout << "동물이 소리를 냅니다." << endl; } }; class Dog : public Animal { public: void speak() { Animal::speak(); // 부모 메서드 호출 cout << "멍멍!" << endl; } }; int main() { Dog d; d.speak(); }💡 설명
- C++에는 super 키워드가 없고, 대신 부모클래스이름::메서드() 형태로 사용
- Animal::speak()가 super.speak() 역할
✅ Python에서의 super
class Animal: def speak(self): print("동물이 소리를 냅니다.") class Dog(Animal): def speak(self): super().speak() # 부모의 메서드 호출 print("멍멍!") dog = Dog() dog.speak()💡 설명
- super()는 부모 클래스의 인스턴스를 반환
- super().speak() → 부모 클래스의 speak() 실행
- super().__init__() → 부모 생성자 호출 가능
✅ C#에서의 super (→ base 키워드 사용)
class Animal { public virtual void Speak() { Console.WriteLine("동물이 소리를 냅니다."); } } class Dog : Animal { public override void Speak() { base.Speak(); // 부모 메서드 호출 Console.WriteLine("멍멍!"); } public Dog() : base() { // 부모 생성자 호출 Console.WriteLine("Dog 객체 생성됨"); } }💡 설명
- C#에서는 super 대신 base 사용
- base.Speak() = 부모 클래스의 Speak() 호출
- : base() = 부모 생성자 호출
🧩 4️⃣ super vs self (Swift 기준)
키워드가리키는 대상예시self 현재 객체 자신 self.name, self.method() super 부모 클래스 super.method(), super.init()
🧾 요약 문장
🔹 super는 “부모 클래스”를 의미하며
🔹 부모의 메서드 호출, 부모의 생성자 실행, 부모 속성 접근 등에 사용된다.
🔹 Swift: super.init(), super.method()
🔹 Java: super(), super.method()
🔹 Python: super().method()
🔹 C#: base.Method(), base()
🔹 C++: ParentClass::Method()
이번엔 객체지향 언어에서 override 키워드가
무엇을 하는지, 그리고 실제로 Swift / Java / Python / C++ / C# 에서
어떻게 쓰이는지 예시로 완전히 정리해줄게 👇
🧩 1️⃣ 기본 개념
🔹 override는 상속된 부모 클래스의 메서드를 자식 클래스에서 “재정의”할 때 사용하는 키워드야.
쉽게 말해 — “부모의 기능을 자식이 자기 버전으로 덮어쓰기”
🧩 2️⃣ 왜 쓰는가?
이유설명✅ 부모의 기본 동작을 변경 예: Animal의 speak() → Dog에서 멍멍으로 변경 ✅ 다형성(polymorphism) 구현 부모 타입으로 호출해도 실제 자식의 메서드가 실행됨 ✅ 코드 재사용 부모 메서드 일부는 그대로 두고, 필요한 부분만 수정
🧩 3️⃣ Swift에서 override
class Animal { func speak() { print("동물이 소리를 냅니다.") } } class Dog: Animal { override func speak() { // 부모의 speak() 재정의 print("멍멍!") } } let a: Animal = Dog() a.speak() // 출력: 멍멍!💡 설명
- override func는 부모의 메서드를 “같은 이름, 같은 매개변수”로 덮어씀
- super.speak()로 부모의 원래 동작도 함께 호출 가능
-
override func speak() { super.speak() print("멍멍!") }
🧩 4️⃣ Java에서 @Override
class Animal { void speak() { System.out.println("동물이 소리를 냅니다."); } } class Dog extends Animal { @Override void speak() { // 부모의 speak() 재정의 System.out.println("멍멍!"); } } public class Main { public static void main(String[] args) { Animal a = new Dog(); a.speak(); // 출력: 멍멍! } }💡 설명
- @Override는 애너테이션(annotation)
- 부모 메서드의 시그니처(이름·매개변수)가 다르면 컴파일 에러 발생 (오타 방지!)
- 다형성(polymorphism) 구현의 핵심
🧩 5️⃣ Python에서 (override 키워드 없음 — 자동 재정의)
class Animal: def speak(self): print("동물이 소리를 냅니다.") class Dog(Animal): def speak(self): # 이름 같으면 자동 override print("멍멍!") a = Animal() b = Dog() a.speak() # 동물이 소리를 냅니다. b.speak() # 멍멍!💡 설명
- Python은 override 키워드가 따로 없고,
동일한 이름의 메서드를 정의하면 자동으로 오버라이드됨.
🧩 6️⃣ C++에서 override
#include <iostream> using namespace std; class Animal { public: virtual void speak() { // virtual: 오버라이드 허용 cout << "동물이 소리를 냅니다." << endl; } }; class Dog : public Animal { public: void speak() override { // 부모의 speak() 재정의 cout << "멍멍!" << endl; } }; int main() { Animal* a = new Dog(); a->speak(); // 출력: 멍멍! }💡 설명
- 부모 메서드에 virtual 붙여야 자식이 override 가능
- override 키워드는 C++11 이후 추가 (오타 방지용)
- 부모 포인터로 호출해도 실제 자식의 메서드 실행 (다형성)
🧩 7️⃣ C#에서 override
class Animal { public virtual void Speak() { Console.WriteLine("동물이 소리를 냅니다."); } } class Dog : Animal { public override void Speak() { Console.WriteLine("멍멍!"); } } class Program { static void Main() { Animal a = new Dog(); a.Speak(); // 출력: 멍멍! } }💡 설명
- 부모 메서드: virtual
- 자식 메서드: override
- 부모 참조로 자식 객체를 호출해도 자식의 메서드 실행됨
🧩 8️⃣ override 키워드 핵심 정리표
언어키워드부모 메서드 표시오버라이드 선언비고Swift override 자동 인식 override func super.method() 가능 Java @Override 자동 @Override 어노테이션, 오타 방지 Python 없음 자동 이름만 같으면 됨 명시적 키워드 없음 C++ virtual + override virtual override C++11 이후 C# virtual + override virtual override base.Method()로 부모 호출
🧩 9️⃣ override vs overload 차이
구분overrideoverload정의 부모 메서드를 재정의 같은 이름, 다른 매개변수로 새로 정의 관계 부모-자식 클래스 간 같은 클래스 내 목적 기존 기능 변경 같은 기능을 여러 방식으로 처리 예시 override func run() func run(speed: Int) / func run(distance: Double)
🧾 한줄 요약
✅ override = 부모의 메서드를 자식 클래스에서 다시 정의
✅ super와 함께 쓰면 부모의 원래 기능 + 추가 기능 가능
✅ 객체지향의 핵심 원리 “다형성(polymorphism)”을 구현하는 키워드