객체 지향 언어를 접하게 되면 자연스레 따라 나오는 개념들이 있다.
속성, 메소드, 생성자, 상속
오늘은 이 개념들에 대해서 나의 언어로 정리해볼 것이다.
1. 속성이란?
일반적으로 객체는 속성(attribute)과 행위(behavior)를 갖는다. 예를 들어, 나라는 사람은 이름이 박태근이고 키 182cm이다.
이때 이름과 키가 속성이 되는것이다.
객체 : 사람
속성 : 이름, 키, 몸무게, 사는 곳, 직업 ....
코드로 살펴보자.
public class Main {
static class Person {
String name;
String country;
int age;
}
public static void main(String[] args) {
Person minsoo = new Person();
minsoo.name = "민수";
minsoo.country = "대한민국";
minsoo.age = 10;
Person paul = new Person();
paul.name = "Paul";
paul.country = "America";
paul.age = 10;
Person[] persons = { minsoo, paul };
for(Person cur : persons) {
System.out.println("<자기소개>");
System.out.println("안녕하세요. " + cur.name + " 입니다.");
System.out.println("저는 "+ cur.country + "에서 태어났습니다.");
System.out.println("현재 "+ cur.age + "살 입니다.");
}
}
}
Class Person을 정의하면서 속성으로 name, country, age를 선언하였다.
이것을 변수(variables)라고 부르기도 하는데 그 이유는 이 속성은 값이 인스턴스마다 다를 수 있기 때문이다.
Class : Person
Variables(속성) : name, country, age
Instance : minsoo
Values : 민수, 대한민국, 10
그렇다면
2. 메소드란?
위에서도 말했듯이 객체는 속성(attribute)과 행위(behavior)로 구성되어 있다.
이때 행위가 곧 객체지향언어에서 말하는 메소드가 되는 것이다.
예를 들어, 나라는 사람은 밥을 먹는다. 걷기도 한다. 자기도 한다.
객체 : 사람
속성 : 이름, 키, 몸무게, 사는 곳, 직업 ....
행위 : 밥 먹음, 걷기, 잠 ....
이와 같이 어떤 동작을 수행하는 것을 말한다.
코드로 살펴보자.
public class Main {
static class Person {
String name;
String country;
int age;
// 자기소개 하는 메소드를 추가
void introduce() {
System.out.println("<자기소개>");
System.out.println("안녕하세요. " + name + " 입니다.");
System.out.println("저는 " + country + "에서 태어났습니다.");
System.out.println("현재 " + age + "살 입니다.");
}
}
public static void main(String[] args) {
Person minsoo = new Person();
minsoo.name = "민수";
minsoo.country = "대한민국";
minsoo.age = 10;
Person paul = new Person();
paul.name = "Paul";
paul.country = "America";
paul.age = 10;
Person[] persons = { minsoo, paul };
for (Person cur : persons) {
cur.introduce(); // 메소드 호출을 통한 자기소개 출력
}
}
}
위 코드를 변형해서 introduce라는 메소드를 선언해주었다.
이제 Class Person은 introduce라는 메소드를 갖게 되어 어느 인스턴스를 생성해도 해당 메소드를 수행할 수 있게 되었다.
Class : Person
Variables(속성) : name, country, age
Method : introduce()
Instance : minsoo
Values : 민수, 대한민국, 10
Action : minsoo.introduce()
3. 생성자(Constructor)란?
객체 지향 프로그래밍에서 객체의 초기화를 담당하는 작업을 위해 재활용할 수 있도록 구현한 코드 블록
으로 정의 할수 있다. 다시 말하자면, 객체 초기화를 담당하는 기능을 수행하는 코드라는 것이다.
그렇다면 객체의 초기화를 담당한다는 것이 뭘까?
일단 인스턴스를 생성하면서 실재하도록 메모리에 할당하는 기능을 수행하는 것이라고 볼수 있다. 이로써 객체는 추상화되어 있던 개념에서 실존하는 것으로 초기화가 된것이다.
그리고 이부분에서 한발짝 더 나가기 위해서는 생성자 예제를 살펴 봐야 한다.
public class Main {
static class Person {
String name;
String country;
int age;
// 생성자 정의
public Person(String name, String country, int age) {
// 여기서 this는 객체 자신을 가리킨다.
// 파이썬의 self와 같다.
this.name = name;
this.country = country;
this.age = age;
}
void introduce() {
System.out.println("<자기소개>");
System.out.println("안녕하세요. " + name + " 입니다.");
System.out.println("저는 " + country + "에서 태어났습니다.");
System.out.println("현재 " + age + "살 입니다.");
}
}
public static void main(String[] args) {
// 인스턴스를 초기화 하면서 속성을 설정할 수 있다.
Person minsoo = new Person("민수", "대한민국", 10);
Person paul = new Person("Paul", "America",10);
Person[] persons = { minsoo, paul };
for(Person cur : persons) {
cur.introduce();
}
}
}
위 코드를 보면 생성자를 선언하면서 인자로 받는 값들을 정의해주었다.
이로써 인스턴스를 생성함과 동시에 속성을 정해줄수 있게 된것이다.
위 코드를 파이썬으로 변환하면 이렇게 된다.
class Person:
def __init__(self, name, country, age):
self.name = name
self.country = country
self.age = age
def introduce(self):
print("<자기소개>")
print(f"안녕하세요. {self.name} 입니다.")
print(f"저는 {self.country}에서 태어났습니다.")
print(f"현재 {self.age}살 입니다.")
minsoo = Person("민수", "대한민국", 10)
paul = Person("Paul", "America", 10)
persons = [minsoo, paul]
for cur in persons:
cur.introduce()
4. 상속(inheritance)이란?
새로운 클래스가 기존의 클래스의 자료와 연산을 이용할 수 있게 하는 기능
으로 정의 된다.
현실세계를 예로 들어보면, 개와 고양이는 동물에 속해 있다 그래서 동물의 속성을 상속받고 개와 고양이만의 특성을 갖기도 한다.

코드로 살펴보자.
public class Main {
static class Animal {
String name;
public void cry() {
System.out.println(name + " is crying.");
}
}
// Dog는 Animal을 상속받는다.
static class Dog extends Animal {
Dog(String name, String breed) {
this.name = name;
this.breed = breed;
}
public void bark() {
System.out.println(name + "(" + breed + ") is barking.");
}
}
public static void main(String[] args) {
Dog dog = new Dog("코코", "허스키");
dog.cry(); // "코코 is crying."
dog.bark(); // "코코(허스키) is barking."
Animal animal = dog;
animal.cry();
// animal.bark(); 실제 객체는 dog와 같더라도, Animal 타입으로 선언한 이상, Dog 타입에 있는 함수는 호출할 수 없습니다.
}
}
위와 같이 Dog는 Animal의 속성을 상속받아 cry()도 수행하고 Bark()도 수행할수 있게 되었다.
이를 파이썬으로 표현하면 아래와 같이 된다.
class Animal:
def __init__(self, name):
self.name = name
def cry(self):
print(self.name + " is crying.")
class Dog(Animal):
def __init__(self, name, breed):
// super 메소드를 사용해서 부모 클래스의 생성자를 참조하였다.
super().__init__(name)
self.breed = breed
def bark(self):
print(self.name + "(" + self.breed + ") is barking.")
dog = Dog("코코", "허스키")
dog.cry() # "코코 is crying."
dog.bark() # "코코(허스키) is barking."
animal = dog
animal.cry()
# animal.bark() - 파이썬에서는 변수의 타입에 따라 동적으로 메소드를 호출할 수 있기 때문에 Dog의 bark 메소드도 호출 가능합니다.
특이사항으로는 파이썬은 타입의 상대적으로 덜 받기 때문에 animal.cry()가 작동한다.
추가예시)
Dog에 추가하여 Cat의 예시를 추가해 보았다.
public class Main {
static class Animal {
String name;
public void cry() {
System.out.println(name + " is crying.");
}
}
static class Dog extends Animal {
String breed;
Dog(String name, String breed) {
this.name = name;
this.breed = breed;
}
public void bark() {
System.out.println(name + "(" + breed + ") is barking.");
}
}
static class Cat extends Animal {
String coatColor;
Cat(String name, String coatColor) {
this.name = name;
this.coatColor = coatColor;
}
public void meow() {
System.out.println(name + " with " + coatColor + " coat is meowing.");
}
}
public static void main(String[] args) {
Dog dog = new Dog("코코", "허스키");
dog.cry();
dog.bark();
Cat cat = new Cat("네로", "검은색");
cat.cry();
cat.meow();
}
}
이로써 '객체 지향 프로그래밍'의 기본 개념을 정리해보았다.
각 개념을 더 깊이 들어가면 끝도 없을것이고 파생되는 개념과 메소드들도 많다.
하지만 이 정리한 내용을 기반으로 살을 붙혀나가면 될 것이다.
'Road to data engineer' 카테고리의 다른 글
| 프로젝트 준비2 : EC2 instance에서 파이썬 프로그램을 실행하기 위한 가상환경 세팅 방법 (0) | 2023.08.28 |
|---|---|
| 프로젝트 준비1 : ML model(feat. iris dataset) flask로 웹 배포하기 (0) | 2023.08.25 |
| 객체 지향 언어 이제 끝1 (0) | 2023.08.23 |
| 빅데이터 엔지니어링 프로젝트 준비하기2-2 - api data to nosql(mongodb) (0) | 2023.08.22 |
| 빅데이터 엔지니어링 프로젝트 준비하기2-1 - api data to mysql (0) | 2023.08.21 |