Day 11(21.09.15) - Gomserker/Java-101 GitHub Wiki
12. κ°μ²΄ μ§ν₯ νλ‘κ·Έλλ° (Object Oriented Programming)
β»λ€μ΄κ°κΈ°μ μμ
μμ
μ λ΄μ©λλ‘ μ 리λ₯Ό νκ³ μκΈ°μ μμκ° μλ€λ‘ μ€λ½κ°λ½ν μ μμ. μλ₯Όλ€μ΄ μμμ λ©μλ μκΈ°λ₯Ό λ¨Όμ ν΄λκ³ κ°μκΈ° OOP μκΈ°λ₯Ό μμνλ€λ κ²μ²λΌ...
(1) κ°μ²΄ μ§ν₯ νλ‘κ·Έλλ°μ΄λ?
νμ€ μΈκ³μμλ μ΄λ€ μ νμ λ§λ€ λ, λ³κ°μ λΆνμ λ°λ‘ κ°λ°νκ³ μ΄λ₯Ό 쑰립νλ κ³Όμ μ ν΅ν΄ μ ν νλλ₯Ό μμ±νλ€. μ΄μ λ§μ°¬κ°μ§λ‘, μννΈμ¨μ΄λ₯Ό κ°λ°ν λμλ λΆνμ ν΄λΉνλ κ°μ²΄λ€μ λ¨Όμ λ§λ€κ³ μ΄ κ°μ²΄λ€μ 쑰립ν΄μ νλ‘κ·Έλ¨μ μμ±νλ κΈ°λ²μ΄ μλλ°, μ΄λ₯Ό κ°μ²΄ μ§ν₯ νλ‘κ·Έλλ°(Object Oriented Programming)μ΄λΌκ³ νλ€.
(2) κ°μ²΄λ 무μμΈκ°?
κ°μ²΄μ μ μλ 물리μ μΌλ‘ μ‘΄μ¬νκ±°λ μΆμμ μΌλ‘ μκ°ν μ μλ κ² μ€μμ μμ μ μμ±μ κ°μ§κ³ μκ³ , λ€λ₯Έ κ²κ³Ό μλ³ κ°λ₯ν κ²μ λ§νλ€. μ½κ² λ§νλ©΄ μ°λ¦¬ μ£Όλ³μ μλ λͺ¨λ κ²λ€μ΄ μ λΆ κ°μ²΄κ° λ μ μλ€. κ°μ²΄λ μμ±κ³Ό λμμΌλ‘ ꡬμ±λμ΄ μλλ°, μλ₯Ό λ€λ©΄ μλμ°¨μ κ²½μ° μμ, λͺ¨λΈκ³Ό κ°μ μμ±μ΄ μκ³ , λ¬λ¦°λ€λ λμμ΄ μλ€. μλ°μμ μ΄λ¬ν μμ±κ³Ό λμμ νλμ λ©μλλΌκ³ λΆλ₯Έλ€.
(3) κ°μ²΄μ ν΄λμ€
νμ€μμ κ°μ²΄λ μ€κ³λλ₯Ό λ°νμΌλ‘ λ§λ€μ΄μ§λ€. μλμ°¨λ₯Ό μλ‘ λ€λ©΄, μ¬λλ€μ΄ μλμ°¨λ₯Ό μ΄μ©νκΈ° μν΄μλ 곡μ₯μμ μ€κ³λλ₯Ό λ³΄κ³ μλμ°¨λ₯Ό λ§λ€μ΄μΌ νλ€. μ΄λ OOPμμλ λ§μ°¬κ°μ§λ€. λ©λͺ¨λ¦¬μμ μ¬μ©νκ³ μΆμ κ°μ²΄κ° μλ€λ©΄ μ€κ³λλ‘ ν΄λΉ κ°μ²΄λ₯Ό λ§λλ μμ μ΄ νμνλ°, μ΄λ νμν μ€κ³λμ κ°λ μ΄ μλ°μμλ ν΄λμ€λΌλ κ²μ΄λ€. ν΄λμ€μλ κ°μ²΄λ₯Ό μμ±νκΈ° μν νλμ λ©μλκ° μ μλμ΄ μλλ°, ν΄λμ€λ‘ λ§λ€μ΄μ§ κ°μ²΄λ₯Ό ν΄λΉ ν΄λμ€μ κ°μ²΄(μΈμ€ν΄μ€)λΌκ³ νλ€. κ·Έλ¦¬κ³ μ΄ ν΄λμ€μμ κ°μ²΄λ₯Ό λ§λλ κ³Όμ μ κ°μ²΄ν(μΈμ€ν΄μ€ν)λΌκ³ νλ€. μλμ°¨μμλ νλμ μ€κ³λλ‘ μ¬λ¬ μλμ°¨λ₯Ό λ§λ€ μ μλ―μ΄, μλ°μμλ νλμ ν΄λμ€μμ μ¬λ¬ κ°μ κ°μ²΄(μΈμ€ν΄μ€)λ₯Ό μμ±ν μ μλ€.
13. ν΄λμ€
(1) ν΄λμ€ μ μΈ
ν΄λμ€λ₯Ό μ¬μ©νκΈ° μν΄μ λ¨Όμ ν΄λμ€λ₯Ό μ μΈν΄μΌ νλλ°, μ΄λ ν΄λμ€μ μ΄λ¦μ λ€λ₯Έ ν΄λμ€μ μλ³λ μ μλλ‘ νλ κ²μ΄ μ€μνλ―λ‘ μλ³μ μμ± κ·μΉμ λ°λΌμ λ§λ€μ΄μΌ νλ€.
- νλ μ΄μμ λ¬Έμλ‘ μμ±ν κ².
- 첫 λ²μ§Έ κΈμμλ μ«μκ° μ¬ μ μλ€.
- '$', '_' μΈμ νΉμ λ¬Έμλ μ¬μ©ν μ μλ€.
- μλ° ν€μλλ μ¬μ©ν μ μλ€.
- μλ° μΈμ΄λ μμ΄ λμλ¬Έμλ₯Ό ꡬλΆνλ€. κ΄λ‘μ μΌλ‘λ ν΄λμ€μ 첫 κΈμλ λλ¬Έμλ₯Ό μ¬μ©νλ€.
(2) κ°μ²΄ μμ±κ³Ό ν΄λμ€ λ³μ
ν΄λμ€λ₯Ό μ μΈνκ³ μ»΄νμΌνλ€λ©΄ μ΄μ κ°μ²΄λ₯Ό μμ±ν μ€κ³λκ° λ§λ€μ΄μ§ κ²μ΄λ€. μ¬κΈ°μ μ΄ μ€κ³λμΈ ν΄λμ€λ₯Ό λ°νμΌλ‘ κ°μ²΄λ₯Ό μμ±νλ €λ©΄ λ€μκ³Ό κ°μ΄ new μ°μ°μ(μμ±μ)λ₯Ό μ¬μ©νλ©΄ λλ€.
new ν΄λμ€λͺ
();
newλ ν΄λμ€λ‘λΆν° κ°μ²΄λ₯Ό μμ±μν€λ μ°μ°μμ΄λ€. new μ°μ°μ λ€μλ μμ±μκ° μ€λλ°, μμ±μλ ν΄λμ€λͺ
() ννλ₯Ό νκ³ μλ€. new μ°μ°μλ‘ μμ±λ κ°μ²΄λ λ©λͺ¨λ¦¬ μμ μ€μμλ heap μμμ μμ±λλλ°, νμ€μμλ 물건μ λμ μμΉλ₯Ό λͺ¨λ₯΄λ©΄ 물건μ μ¬μ©ν μ μλ―μ΄ μλ°μ κ°μ²΄λ λ§μ°¬κ°μ§μ΄λ€. κ·Έλμ new μ°μ°μλ heap μμμ κ°μ²΄λ₯Ό μμ±μν¨ ν, stack μμμ κ°μ²΄μ μ£Όμλ₯Ό 리ν΄νλλ‘ λμ΄ μλ€.
λ€μ νλ‘κ·Έλ¨μ Student ν΄λμ€λ₯Ό μ μΈνκ³ StudentExample ν΄λμ€μ main() methodμμ Student κ°μ²΄λ₯Ό μμ±νλ κ³Όμ μ λνλΈ νλ‘κ·Έλ¨μ΄λ€.
//Student.java
public class Student{
}
//StudentExample.java
public class StudentExample {
public static void main(String[] args) {
Student s1 = new Student();
System.out.println("s1 λ³μκ° Student κ°μ²΄λ₯Ό μ°Έμ‘°ν©λλ€.");
Student s2 = new Student();
System.out.println("s2 λ³μκ° λ λ€λ₯Έ Student κ°μ²΄λ₯Ό μ°Έμ‘°ν©λλ€.");
}
}
result
s1 λ³μκ° Student κ°μ²΄λ₯Ό μ°Έμ‘°ν©λλ€.
s2 λ³μκ° λ λ€λ₯Έ Student κ°μ²΄λ₯Ό μ°Έμ‘°ν©λλ€.
μμ κ° μ€νλλ©΄ stack λ©λͺ¨λ¦¬μ heap λ©λͺ¨λ¦¬μ κ°κ° ν΄λμ€ λ³μμ κ°μ²΄κ° μμ±λλ€. Student ν΄λμ€λ νλμ§λ§ new μ°μ°μλ₯Ό μ¬μ©ν νμλ§νΌ κ°μ²΄κ° λ©λͺ¨λ¦¬μ μμ±λλ€. μ΄λ¬ν κ°μ²΄λ€μ Studentμ΄ μΈμ€ν΄μ€λ€μ΄λ€. κ°μ ν΄λμ€μμ μμ±λμμ΄λ κ°κ°μ Student κ°μ²΄λ μμ λ§μ κ³ μ λ°μ΄ν°λ₯Ό κ°μ§λ©΄μ λ©λͺ¨λ¦¬μμ νλνκ² λλ€. μ¦, s1μ΄ μ°Έμ‘°νλ Student κ°μ²΄μ s2κ° μ°Έμ‘°νλ Student κ°μ²΄λ μμ ν λ 립λ μλ‘ λ€λ₯Έ κ°μ²΄λΌλ λ»μ΄λ€.
(3) ν΄λμ€μ κ΅¬μ± λ©€λ²
ν΄λμ€μλ κ°μ²΄κ° κ°μ ΈμΌν κ΅¬μ± λ©€λ²κ° μ μΈλλ€. κ΅¬μ± λ©€λ²μλ νλ(Field), μμ±μ(Constructor), λ©μλ(Method)κ° μλ€. μ΄ κ΅¬μ± λ©€λ²λ μλ΅λκ±°λ μ¬λ¬κ° μμ±λ μ μλ€.
public class ClassName {
//field : κ°μ²΄μ λ°μ΄ν°κ° μ μ₯λλ κ³³
int fieldName;
//constructor : κ°μ²΄ μμ± μ μ΄κΈ°ν μν λ΄λΉ
ClassName() { ...}
//method : κ°μ²΄μ λμμ ν΄λΉνλ μ€ν λΈλ‘
void methodName() {...}
}
νλ(field)
κ°μ²΄μ κ³ μ λ°μ΄ν°, λΆν κ°μ²΄, μν μ 보λ₯Ό μ μ₯νλ κ³³μ΄λ€. μ μΈ ννλ λ³μμ λΉμ·νμ§λ§ νλλ₯Ό λ³μλΌκ³ λΆλ₯΄μ§λ μλλ€. λ³μλ μμ±μμ λ©μλ λ΄μμλ§ μ¬μ©λκ³ μμ±μμ λ©μλκ° μ€ν μ’ λ£λλ©΄ μλμΌλ‘ μλ©Έλλ€. λ°λ©΄, νλλ μμ±μμ λ©μλ μ 체μμ μ¬μ©λλ©° κ°μ²΄κ° μλ©Έλμ§ μλ ν κ³μ μ‘΄μ¬νλ€.
μμ±μ(constructor)
μμ±μλ new μ°μ°μλ‘ νΈμΆλλ νΉλ³ν μ€κ΄νΈ {} λΈλ‘μ΄λ€. μμ±μμ μν μ κ°μ²΄ μμ±μ μ΄κΈ°νμΈλ°, νλλ₯Ό μ΄κΈ°ν νκ±°λ, ν€μλλ₯Ό νΈμΆν΄μ κ°μ²΄λ₯Ό μ¬μ©ν μ€λΉλ₯Ό νλ€. λ©μλμ λΉμ·νκ² μκ²Όμ§λ§ ν΄λμ€ μ΄λ¦μΌλ‘ λμ΄ μκ³ , λ¦¬ν΄ νμ μ΄ μλ€.
λ©μλ(method)
λ©μλλ κ°μ²΄μ λμμ ν΄λΉνλ μ€κ΄νΈ {} λΈλ‘μ λ§νλ€. μ΄ μ€κ΄νΈ λΈλ‘μ μ΄λ¦μ΄ λ©μλμ μ΄λ¦μ΄ λλ€. λ©μλλ₯Ό νΈμΆνλ©΄ μ€κ΄νΈ λΈλ‘ μμ μλ λͺ¨λ μ½λλ€μ΄ μΌκ΄μ μΌλ‘ μ€νλλλ°, νλλ₯Ό μ½κ³ μμ νλ μν λ νμ§λ§, λ€λ₯Έ κ°μ²΄λ₯Ό μμ±ν΄μ λ€μν κΈ°λ₯μ μννκΈ°λ νλ©°, κ°μ²΄ κ°μ λ°μ΄ν° μ λ¬μ μλ¨μΌλ‘λ μ¬μ©λλ€.
14. νλ(field)
νλλ κ°μ²΄μ κ³ μ λ°μ΄ν°, κ°μ²΄κ° κ°μ ΈμΌν λΆν λ±μ λ°μ΄ν°λ₯Ό μ μ₯νλ κ³³μ΄λ€. μλμ°¨ κ°μ²΄κ° μλ€κ³ κ°μ ν λ, μ μ‘°μ¬, λͺ¨λΈ, μκΉ λ±μ κ³ μ λ°μ΄ν°μ ν΄λΉνκ³ , νμ¬ μλ, μμ§ RPM λ±μ μν λ°μ΄ν°μ ν΄λΉνλ©°, 차체, μμ§, νμ΄μ΄λ λΆνμ ν΄λΉνλ€ λ³Ό μ μλ€. λ°λΌμ ν΄λΉ λ°μ΄ν°λ€μ μλμ°¨μ ν΄λμ€λ₯Ό μ€κ³ν λ νλλ‘ μ μΈλμ΄μΌ νλ€.
public class Car {
//μλμ°¨ ν΄λμ€ μ μΈ
String company;
String model;
String color;
int maxSpeed;
// κ³ μ λ°μ΄ν°
int speed;
int rpm;
// μν
Body body;
Engine engine;
Tire tire;
// λΆν
(1) νλ μ μΈ
νλ μ μΈμ ν΄λμ€ μ€κ΄νΈ λΈλ‘ μ΄λμλ κ°λ₯νλ€. νμ§λ§ μμ±μμ λ©μλμ μ€κ΄νΈ λΈλ‘ λ΄λΆμμλ μ μΈλ μ μλ€. μμ±μμ λ©μλμ μ€κ΄νΈ λΈλ‘ λ΄λΆμ μ μΈλ κ²μ μ λΆ λ‘컬 λ³μλ‘ μ·¨κΈλμ΄ λ€λ₯Έ λΈλ‘μμ μ¬μ©ν μ μκ² λλ€. νλ μ μΈμ λ³μμ μ μΈκ³Ό λΉμ·νκΈ° λλ¬Έμ νλλ₯Ό ν΄λμ€ λ©€λ² λ³μλΌκ³ λΆλ₯΄κΈ°λ νλ€. (κΆμ₯νμ§λ μμ) μ μΈ ν λλ μλμ κ°μ΄ μ μΈνλ€.
νμ
νλ = μ΄κΈ°κ°;
νμ μλ κΈ°λ³Έ νμ , μ°Έμ‘° νμ μ΄ λͺ¨λ μ¬ μ μμΌλ©°, μ΄κΈ°νλ μλ΅ κ°λ₯νλ€.
(2) νλ μ¬μ©
νλ μ¬μ©μ μλ―Έλ νλκ°μ μ½κ³ λ³κ²½νλ€λ κ²μ λ§νλ€. ν΄λμ€ λ΄λΆμ μμ±μλ λ©μλμμ μ¬μ©ν λ λ¨μν νλ μ΄λ¦μΌλ‘ μ½κ³ λ³κ²½νλ©΄ λμ§λ§ μΈλΆμμ μ¬μ©ν κ²½μ°μ ν΄λμ€λ‘λΆν° κ°μ²΄λ₯Ό μμ±ν λ€μ νλλ₯Ό μ¬μ©ν΄μΌ νλ€. κ·Έ μ΄μ λ νλλ κ°μ²΄μ μμλ λ°μ΄ν°μ΄κΈ° λλ¬Έμ΄λ€. λ°λΌμ κ°μ²΄κ° μ‘΄μ¬νμ§ μλλ° νλκ° μ‘΄μ¬ν μ μλ€.
public class WhoseCar
void method() {
Car myCar = new Car();
// Car κ°μ²΄ μμ±
myCar.speed = 60;
// νλ μ¬μ©
}
public class Car
//field
int speed;
//constructor
Car() {
speed = 0;
}
//method
void method(...) {
speed = 10;
}
μ μμμμ Car ν΄λμ€μ speed νλλ μμ±μμ λ©μλμμ λ³κ²½μ΄ κ°λ₯νλ€. μ¬μ© λ°©λ²μ λ³μμ λμΌνμ§λ§ μ°¨μ΄μ μ λ³μλ μμ μ΄ μ μΈλ λΈλ‘ λ΄λΆμμλ§ μ¬μ©ν μ μμ§λ§ νλλ μμ±μμ λͺ¨λ λ©μλμμ μ¬μ©ν μ μλ€. μΈλΆ ν΄λμ€μΈ WhoseCar ν΄λμ€μμ Car ν΄λμ€μ νλμΈ speedλ₯Ό μ¬μ©νλ €λ©΄ Car κ°μ²΄λ₯Ό λ¨Όμ μμ±ν΄μΌ νλ€.
myCar λ³μκ° Car κ°μ²΄λ₯Ό μ°Έμ‘°νκ² λλ©΄ λνΈ(.) μ°μ°μλ₯Ό μ¬μ©ν΄ speed νλμ μ κ·Όν μ μκ² λλ€.
(3) μμ
- λ€μμ κ°μμ§μ μ 보λ₯Ό μΆλ ₯ν΄μ£Όλ νλ‘κ·Έλ¨μ μμ±ν κ²μ΄λ€.
//Dog.java
public class Dog {
// field μ μΈ
String name;
int age;
double weight;
//κΈ°λ₯ method
void bark() {
System.out.println("λ©λ©");
}
//κ°μμ§μ μ 보 μΆλ ₯
void printInfo() {
System.out.println(name);
System.out.println(age);
System.out.println(weight);
}
}
public class WhoseDog {
public static void main(String[] args) {
//κ°μμ§ νλ§λ¦¬ κ°μ²΄ μμ±
Dog dog1 = new Dog(); //Dog κ°μ²΄λ₯Ό μ°Έμ‘°νλ μ°Έμ‘°λ³μ dog1
dog1.name = "μ΄μ½";
dog1.age = 3;
dog1.weight = 3.5;
// Dog ν΄λμ€μ νλμ μ 보 μ μ₯
dog1.printInfo();
// μ 보λ₯Ό μΆλ ₯νλ λ©μλ printInfo() μ€ν
}
}
result
μ΄μ½
3
3.5
- λ€μμ μλμ°¨μ μ μμ μΆλ ₯νλ νλ‘κ·Έλ¨μ μμ±ν κ²μ΄λ€.
result
manufacturer: νλμλμ°¨
model: grandeur
color: black
maximum speed: 350
current speed: 0
changed speed: 60