자바는 Python 과 달리 그렇게 친절한 코드는 아닙니다. 물론, 이 친절함의 비중은 입장에 따라 달라지겠지만. Python 이 사용자에게 친절한 것이라면 Java 나 C# 계열의 언어들은 컴퓨터에게 친절한 언어가 되겠습니다. 말이 컴퓨터지, 사실상 코드를 배우다 보면 혼자서 알아서 할 줄 아는게 없는 친구니까요.

 

오늘은 Java의 상속과 Override 를 내 스스로에게 설명해보는 과정입니다 


 

Java Inheritance (Subclass and Superclass)

W3Schools offers free online tutorials, references and exercises in all the major languages of the web. Covering popular subjects like HTML, CSS, JavaScript, Python, SQL, Java, and many, many more.

www.w3schools.com

우리의 소중한 친구, W3에서 코드를 가져와서 봅시다. 

class Vehicle {
  protected String brand = "Ford";        // Vehicle attribute
  public void honk() {                    // Vehicle method
    System.out.println("Tuut, tuut!");
  }
}

class Car extends Vehicle {
  private String modelName = "Mustang";    // Car attribute
  public static void main(String[] args) {

    // Create a myCar object
    Car myCar = new Car();

    // Call the honk() method (from the Vehicle class) on the myCar object
    myCar.honk();

    // Display the value of the brand attribute (from the Vehicle class) and the value of the modelName from the Car class
    System.out.println(myCar.brand + " " + myCar.modelName);
  }
}

이 코드은 Vehicle 이라는 차량(탈 것) 이라는 것에서, Car(자동차)을 주고있습니다. 

 

논리적으로 생각을 해보면,

자동차도 탈 것의 하나니까.

그 넓은 개념을 상속받는 것에 문제는 없어보입니다. 

 

비슷한 예시를 들어봅시다

 

Phone 은 SmartPhone 을 

 

Printer 는 3DPrinter 을

 

이렇게 다음세대를 가져올 수도 있고 

 

Animal 은 Dog를 가져올 수도 있을 것입니다

 

대충 감이 잡히시나요? 

 

이 Inherit 이라는 단어가 의미하는 것처럼

(컴퓨터쪽에서는 상속이라고 번역함 - 유전이라는 뜻도 있음)

 

본래의 코드가 의미하는 성질을 다음세대에 재활용 할 수 있게 해주는 마법같은 녀석입니다. 

그렇다면 코드의 재활용과 유지보수가 어렵지 않겠죠?

이 녀석의 포괄적인 개념은 여기까지하고, 이제 활용에 들어가는 것을 공부해 봅시다.


Animal(동물) 이라는 코드를 Dog(개)가 상속하고 있습니다

class Animal {
    void makeSound() {
        System.out.println("Some generic animal sound");
    }
}

class Dog extends Animal {
    @Override
    void makeSound() {
        System.out.println("Woof! Woof!");
    }

    void wagTail() {
        System.out.println("Dog is wagging its tail.");
    }
}

public class Main {
    public static void main(String[] args) {
        Animal genericAnimal = new Animal();
        Dog myDog = new Dog();

        // Calling the makeSound method of the Animal class
        genericAnimal.makeSound();

        // Calling the overridden makeSound method of the Dog class
        myDog.makeSound();

        // Calling the wagTail method specific to the Dog class
        myDog.wagTail();
    }
}

 

어? 보니까 이상한 녀석이 있네요. 듣도 보지도 못한 @Override 라는 녀석이 있습니다. 

이 친구는 어떤 친구일까요? 

직역을 하면, 덮어 씌우다. 라는 말을 지니고 있습니다. 

즉, 본래 Animal 안에 있는 메소드를 자식 클래스에서 다르게 쓰였을때. 

 

컴퓨터에게 "이 코드는 다시, 다르게  쓰인 녀석이야" 알려주는 표식입니다. 

이 Override는 Super()와 함꼐 자주 쓰이니까 기억해두세요! 

Super()는 다음 포스팅에서 공부해보겠습니다.

 

 

요즘애들은 고등학교에서도 파이썬을 배우고 심하면 C언어도 배운다고 하던데

내가 고등학교때에는 그런거 없었거든요? 

그러면 좀 상대적 박탈감이 들기도 하구 뭐 별 수 있나

시대가 빠르게 변화하고있는데 그 시대에 걸맞게 어린아이들을 올바르게 교육시켜서 사회로 내보내는게 학교의 역할인데

 

내가 학교다니던 2012~2015년의 시기에는 코딩 배우는게 올바르지는 않았나? 봐요 

무튼 사담은 뒤로 하고 오늘 하루종일 학교에서 배운거(연습) 공유함

작은 성취감이 느껴지는 것을 뒤로 하고 

파이썬입니다! 

현직자 친구들이 보면

"이 새끼 존나 기본적인거 하면서 블로그에 글 쓰네 ㅉㅉ" 이렇게 말 하지 않을까요?

잘은 몰루?

 

Visual Studio에서 복사 붙여넣기한 것입니다. 나만 보고싶은데

개발자는 세상 심라 만상 모든것이

나의 것이 아님임을 깨닫고 자기가 만든 코드를 남들한테

공유하는 마음 가짐이 젤 중요하데요.

 


#Scenario - Library requires a new system
#First step : identifying the classes

class Library: #큰 개념 - 전체적인 큰 블럭을 말합니다
    def __init__(self):
        self.books=[] #Attributes
        self.patrons=[]
    def add_book(self, book):
        self.book.append(book)

        #self는 자기자신을 부르는애에요, 자기 자신을 말하는 딕셔너리 라고도 생각하면 됩니다
 
#작은개념(Constructor:생성자) // 아니 번역 개떡같이 해놨는데 뭐 생선자라니까 생선자라구 할게요
class Patron:          #Patron 은 후원자를 말하기도 하지만, 주요 상점/식당의 고객들을 지칭하는 "공식어휘"
    def __init__(self): #내부 애들을 지어볼까요
        self.borrowed_books = [] #List to storae borrowed books
        self.idname = []
        self.name =[]
        self.book=[]

        #얘내들은 아직까지 할 줄 아는게 없습니다. 비유를 하자면 내 손에 "핸드폰"이 들려있다고 해서
        #그 핸드폰이 스스로 무언가를 하는것은 아닙니다, 그러니 유저들이 "상호작용"을 해줘야하잖아요?
        #그러니 함수를 설정해 어떻게 사용할지 넣어줍시다, 함수는 가능한 시나리오중 하나를 묘사하는 거라구 생각하면 편합니다
        #그러니까, 앞서 비유한 핸드폰을 갖고 "친구한테 전화하기" 라는 함수를 만드는거에요.
        #핸드폰 번호도 넣어주고 해야겠죠? 친구한테 전화할려면 친구 전화번호를 넣어야지 아무 번호만 넣으면 안되잖아요
   
    def __str__(self):  
        return(f"{self.borrowed_books}, Your ID Num {self.idname} and {self.name}")
    #__str__ 함수는 신기한 녀석입니다, 이 함수로 오브젝트를 String 으로 표현할수이써요, 생각해보니까 이놈 이름도 String 이라는걸 함수로 표현한 친구네요. 참 착한 친구에요
    #객체 내부에서 넘어오는 값을 String으로 출력할때 이 착한 친구는 필수적이에요
     # 만약에, 이 녀석이 없이 함수를 출력한다면, 해당 객체의 "메모리 주소"를 출력합니다
     # 그러니까 메모리를 집이라고 생각한다면, 그 집의 주소를 말하는거에요
     # 친구의 이름을 불러야하는데, 친구집 주소만 알고있다면 "00시 00구 00로 00아파트 00호수 사는 놈" 이라고 부르는 거잖아요? 그럼 좀 이상하잖아요?
     # 그럴때 __Str__ 친구를 불러서 이름을 알려주는 겁니다, 컴퓨터는 똑똑한 친구지만 하나하나 알려줘야하는 귀찮음이 있어요.

    #이제 책을 빌려봅시다
    #책빌리기 함수!
    def borrow_book(self,book):
        if book.is_borrowed:
            print(f"sorry, {book.name} is out on loan")
        else:
            book.is_borrowed = True #책이 빌려진게 맞다면
            self.borrowed_books.append(book) #빌린책들의 리스트에 추가해봅시다

            #참고로 파이썬에서 . 점은 다른 Method 에서 개념을 가져온겁니다
            #헉 이거 모르면 님아 개념 놓친거임 이거 할때가 아님 개념 ㄱㄱ
   
    def return_book(self,book):
        for borrowed_book in self.borrowed_books:
            if borrowed.book.name == book.name: #빌린 책의 이름이
                print.is_borrowed = False
                self.borrowed_books.remove(book)

    def view_borrowed_book(self,book):
        borrowed_books_list = []
        for book in self.borrowed_book: #for 반복 함수로 리스트를 만드는 행위입니다.
            print.borrowed_books_list.append(str{book}) #여기서 str은 오는 값을 string으로 출력하라는 소리입니다
            #예시를 들어볼께요, 친구, 친구의 이름을 기억하기 쉽게 아저씨 같은 이름을 넣어봅시다
            #김덕배(48세, 무직 배수)라는 친구를 뒀다고 생각해요
            #그 친구의 나이는 우리가 48이라는걸 알아요
            #근데 컴퓨터는 어린아이 같아서, 그 숫자가 왜 주어진지 말을 해줘야하거드요.
            #안그러면 잉?? 48??? 뭐지 마법의 숫자인가? 하면서 아무것도 안해요 컴퓨터는 참 인생 편하게 삽니다
            #그때 개발자 친구들이 말해줍니다 "예야, 48이라는 숫자는 스트링이야"
            #그럼 컴퓨터가 그 숫자를 기억하고 48은 스트링이구나! 라고 기억을 할거에요
            #이런 같은 개념으로 int, str, float, chr 같은 것으로 할당이 가능합니다. 콤퓨타는 인생 편하게 살아서 좋겠죠?
    def __str__(self) -> str:
        return(f"{self.name}, is a {self.name}")
   
   
   
       

class Book: #작은 개념 2 (Constructor)
    def __init__(self, name, genre, year, is_borrowed):
        self.name = name
        self.genre = genre
        self.year = year
        self.is_borrowed = False
    def __str__(self):
        return(f"Title:{self.name}, Genre:{self.genre},Publish year{self.year}. is borrowed")

#만들어진 애들을 테스트 해봅시다. 내가 만든 코드니까 내가 좋아하는걸 넣을꺼에요
book1 = Book("Steins;Gate", "Sci-fi","2008", "is borrowed")
print(book1)

view_borrowed_book()
        #항상 콤마가 적절히 사용되었는지 확인해봅시다... 아까도 이거땜에 오류 겁나 났엇음
 
 
#오늘 배운 중요개념 
 클래스가 가진 함수를 method 라고 부른다
 클래스 내부에 함수를 정하고 싶으면, self를 넣어줘야한다. <---- 이건 자바나 C언어는 다른거 넣음. 
 클래스는 하나의 도구를 내 스스로 만드는 과정이고, 그 도구를 만들어 내가 원하는 것을 조각한다
 

 

+ Recent posts