ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • iOS 7주차
    iOS 2025. 10. 14. 15:44

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

    저장된 프로퍼티 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)”을 구현하는 키워드

     

    'iOS' 카테고리의 다른 글

    11주차  (0) 2025.11.11
    iOS 9주차  (0) 2025.10.28
    5주차  (0) 2025.09.30
    4주차  (0) 2025.09.23
    iOS 3주차  (0) 2025.09.16
Designed by Tistory.