๐Today...
Most powerful is he who has himself in his own power. - Seneca
โ์ค๋์ TIL(Today I Learn)
์์๊ณผ ํฌํจ๊ด๊ณ
์์(inheritance)์ ๊ธฐ์กด์ ํด๋์ค๋ฅผ ์ฌํ์ฉํ์ฌ ์๋ก์ด ํด๋์ค๋ฅผ ์์ฑํ๋ ์๋ฐ์ ๋ฌธ๋ฒ์์์ด๋ค. ํ์ฅ๋์๋ค๋ ๋ป๊ณผ ๊ฐ์ผ๋ฉฐ extendsํค์๋๋ฅผ ์ฌ์ฉํ๋ค. ์๋ฐ์ ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ์์๋ ๋จ์ผ์์(Single inheritance)๋ง์ ํ์ฉํ๋ค. ํ์ง๋ง ์ธํฐํ์ด์ค๋ผ๋ ๋ฌธ๋ฒ์์๋ฅผ ์ฌ์ฉํด์ ๋ค์ค์์๊ณผ ๋น์ทํ ํจ๊ณผ๋ฅผ ๋ด๋๊ฒ์ด ๊ฐ๋ฅํ๋ค.
public class Main {
public static void main(String[] args) {
Bike bike = new Bike();
Car car = new Car();
MotorBike motorBike = new MotorBike();
bike.run();
car.run();
motorBike.run();
}
}
class Vehicle {
void run() {
System.out.println("Vehicle is running");
}
}
class Bike extends Vehicle {
void run() {
System.out.println("Bike is running");
}
}
class Car extends Vehicle {
void run() {
System.out.println("Car is running");
}
}
class MotorBike extends Vehicle {
void run() {
System.out.println("MotorBike is running");
}
}
// ์ถ๋ ฅ๊ฐ
Bike is running
Car is running
MotorBike is running
ํฌํจ(Composite) ๊ด๊ณ๋ ์์์ฒ๋ผ ํด๋์ค๋ฅผ ์ฌ์ฌ์ฉํ ์ ์๋ ๋ฐฉ๋ฒ์ผ๋ก, ํด๋์ค์ ๋ฉค๋ฒ๋ก ๋ค๋ฅธ ํด๋์ค ํ์ ์ ์ฐธ์กฐ๋ณ์๋ฅผ ์ ์ธํ๋ ๊ฒ์ ์๋ฏธํ๋ค. ์๋ ์์ ๋ก ํ์ธํ์...!
public class Employee {
int id;
String name;
Address address; //์๋ถ๋ถ์ด ์ฐธ์กฐ๋ณ์๋ฅผ ์ ์ธํด์ ํฌํจ๊ด๊ณ๋ก ์ฌ์ฉ
public Employee(int id, String name, Address address) {
this.id = id;
this.name = name;
this.address = address;
}
void showInfo() {
System.out.println(id + " " + name);
System.out.println(address.city+ " " + address.country);
}
public static void main(String[] args) {
Address address1 = new Address("์์ธ", "ํ๊ตญ");
Address address2 = new Address("๋์ฟ", "์ผ๋ณธ");
Employee e = new Employee(1, "๊น์ฝ๋ฉ", address1);
Employee e2 = new Employee(2, "๋ฐํด์ปค", address2);
e.showInfo();
e2.showInfo();
}
}
class Address {
String city, country;
public Address(String city, String country) {
this.city = city;
this.country = country;
}
}
// ์ถ๋ ฅ๊ฐ
1 ๊น์ฝ๋ฉ
์์ธ ํ๊ตญ
2 ๋ฐํด์ปค
๋์ฟ ์ผ๋ณธ
# Object Class
object ํด๋์ค๋ ์๋ฐ์ ํด๋์ค ์์ ๊ณ์ธต๋์์ ์ต์์์ ์์นํ ํด๋์ค์ด๋ค. ์๋ฐ์ ๋ชจ๋ ํด๋์ค๋ Object ํด๋์ค๋ก ๋ถํฐ ํ์ฅ์ด ๋๋ค. ๋ค๋ฅธ ํด๋์ค๋ก ๋ถํฐ ์๋ฌด๋ฐ ์์์ ๋ฐ์ง ์๋ ํด๋์ค๋ ์๋์ผ๋ก extends Object๋ฅผ ์ถ๊ฐํ๋ค.
class ParentEx { // ์ปดํ์ผ๋ฌ๊ฐ "extends Object" ์๋ ์ถ๊ฐ
}
class ChildEx extends ParentEx {
}
Method Overriding
๋ฉ์๋ ์ค๋ฒ๋ผ์ด๋ฉ์ ์์ํด๋์ค๋ก ๋ถํฐ ์์๋ฐ์ ๋ฉ์๋์ ๋์ผํ ์ด๋ฆ์ ๋ฉ์๋๋ฅผ ์ฌ์ ์ ํ๋๊ฒ์ ์๋ฏธํ๋ค. ์์ ํด๋์ค์ ๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉ ํ๋ ค๋ฉด ๋ค์ 3๊ฐ์ง ์กฐ๊ฑด์ด ์ฑ๋ฆฝ๋์ผํ๋ค.
- ๋ฉ์๋ ์ ์ธ๋ถ๊ฐ ์์ํด๋์ค์ ๊ทธ๊ฒ๊ณผ ์์ ํ ์ผ์นํด์ผ ํ๋ค.
- ์ ๊ทผ์ ์ด์์ ๋ฒ์๊ฐ ์์ ํด๋์ค์ ๋ฉ์๋๋ณด๋ค ๊ฐ๊ฑฐ๋ ๋์ด์ผ ํ๋ค.
- ์์ธ๋ ์์ํด๋์ค์ ๋ฉ์๋๋ณด๋ค ๋ง์ด ์ ์ธํ ์์๋ค.
public class Main {
public static void main(String[] args) {
Bike bike = new Bike();
Car car = new Car();
MotorBike motorBike = new MotorBike();
bike.run();
car.run();
motorBike.run();
}
}
class Vehicle {
void run() {
System.out.println("Vehicle is running");
}
}
class Bike extends Vehicle {
void run() {
System.out.println("Bike is running");
}
}
class Car extends Vehicle {
void run() {
System.out.println("Car is running");
}
}
class MotorBike extends Vehicle {
void run() {
System.out.println("MotorBike is running");
}
}
// ์ถ๋ ฅ๊ฐ
Bike is running
Car is running
MotorBike is running
super&super()
# super()
super()ํค์๋๋ ์์ ํด๋์ค์ ์์ฑ์๋ฅผ ํธ์ถํ๋ ๊ฒ์ ์๋ฏธํ๋ค. ๊ทธ๋ฆฌ๊ณ ์์ฑ์์์์๋ง ์ฌ์ฉ์ด ๊ฐ๋ฅํ๊ณ ๋ฐ๋์ ์ฒซ์ค์ ์์ผ๋ง ํ๋ค. ๋ง์ฝ super()๊ฐ ์๋ ๊ฒฝ์ฐ์๋ ์์ ์์ฑ์์ ์ฒซ์ค์ ์ปดํ์ผ๋ฌ๊ฐ ์๋์ผ๋ก super()๋ฅผ ์ฝ์ ํ๋ค. ์ด๋ ์์ํด๋์ค์ ๊ธฐ๋ณธ์์ฑ์๊ฐ ์์ผ๋ฉด ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
public class Test {
public static void main(String[] args) {
Student s = new Student();
}
}
class Human {
Human() {
System.out.println("ํด๋จผ ํด๋์ค ์์ฑ์");
}
}
class Student extends Human { // Human ํด๋์ค๋ก๋ถํฐ ์์
Student() {
super(); // Human ํด๋์ค์ ์์ฑ์ ํธ์ถ
System.out.println("ํ์ ํด๋์ค ์์ฑ์");
}
}
// ์ถ๋ ฅ๊ฐ
ํด๋จผ ํด๋์ค ์์ฑ์
ํ์ ํด๋์ค ์์ฑ์
# super
super ํค์๋๋ ์์ํด๋์ค์ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํจ๋ค. ๋ง์ฝ ๋ถ๋ชจ์ ๋ฉค๋ฒ ๋ณ์์ ์์์ ๋ฉค๋ฒ๋ณ์์ ์ด๋ฆ์ด ๊ฐ๋ค๋ฉด super.๋ถ๋ชจ๋ฉค๋ฒ๋ช ์ ์ง์ ํ์ฌ ๋ถ๋ชจ์ ๋ฉค๋ฒ๋ณ์๋ช ์ ๊ฐ๋ฆฌํฌ์์๋ค.
public class Example {
public static void main(String[] args) {
SubClass subClassInstance = new SubClass();
subClassInstance.callNum();
}
}
class SuperClass {
int count = 20; // super.count
}
class SubClass extends SuperClass {
int count = 15; // this.count
void callNum() {
System.out.println("count = " + count);
System.out.println("this.count = " + this.count);
System.out.println("super.count = " + super.count);
}
}
// ์ถ๋ ฅ๊ฐ
count = 15
count = 15
count = 20
์บก์ํ์ ํจํค์ง
์บก์ํ๋ ํน์ ๊ฐ์ฒด ์์ ๊ด๋ จ๋ ์์ฑ๊ณผ ๊ธฐ๋ฅ์ ํ๋์ ์บก์๋ก ๋ง๋ค์ด ๋ฐ์ดํฐ๋ฅผ ์ธ๋ถ๋ก ๋ณดํธํ๋ ๊ฒ์ ๋งํ๋ค. ๋ฐ์ดํฐ๋ณดํธ์ ๋ด๋ถ์ ์ผ๋ก ์ฌ์ฉ๋๋ ๋ฐ์ดํฐ๋ฅผ ์ธ๋ถ๋ ธ์ถ๋ก๋ถํฐ ๋ฐฉ์งํ๊ธฐ ์ํจ์ด๋ค. (data hiding)
ํจํค์ง(package)๋ ํน์ ํ ๋ชฉ์ ์ ๊ณต์ ํ๋ ํด๋์ค์ ์ธํฐํ์ด์ค์ ๋ฌถ์์ ์๋ฏธํ๊ณ ์๋ฐ์์์ ํจํค์ง๋ ๋ฌผ๋ฆฌ์ ์ธ ํ๋์ directory์ด๋ค. ์ด directory๋ ๊ณ์ธต๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๊ณ ์๊ณ , ๊ณ์ธต๊ฐ์ ๊ตฌ๋ถ์ (.)์ผ๋ก ํํํ๋ค. ํจํค์ง์ ์ฅ์ ์ ํด๋์ค์ ์ถฉ๋์ ๋ฐฉ์งํด์ค๋ค. ๊ฐ์ ์ด๋ฆ์ ํด๋์ค๋ฅผ ๊ฐ์ง๊ณ ์๋๋ผ๋ ๋ค๋ฅธ ํจํค์ง์ ์์๋๋ฉด ์ด๋ฆ๋ช ์ผ๋ก ์ถฉ๋์ด ๋ฐ์ํ์ง ์๋๋ค.
ํจํค์ง์ ์ ์ธ์ ์๋ ์ฝ๋์ ๊ฐ์ด ์ ์ธํ๋ค.
package practicepack.test2; // import ๋ฌธ์ ์ฌ์ฉํ์ง ์๋ ๊ฒฝ์ฐ, ๋ค๋ฅธ ํจํค์ง ํด๋์ค ์ฌ์ฉ๋ฐฉ๋ฒ
public class PackageImp {
public static void main(String[] args) {
practicepack.test.ExampleImport example = new practicepack.test.ExampleImport();
}
}
ํ์ง๋ง ์์๊ฐ์ด ๋ค๋ฅธํจํค์ง์ ํด๋์ค๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ์ ์ธ์์ ํจํค์ง๋ช ์ ๋ชจ๋ ํฌํจ์์ผ์ ์ ๋ณด๋ฅผ ์ ๊ณตํด์ผํ๋ค. ์ด๋ฅผ ์ข๋ ์ฝ๊ฒ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด import์ด๋ค. ์ฌ์ฉ๋ฒ์ ์๋์ ๊ฐ๋ค.
package practicepack.test;
public class ExampleImp {
public int a = 10;
public void print() {
System.out.println("Import ๋ฌธ ํ
์คํธ")
}
package practicepack.test2; // import ๋ฌธ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ
import practicepack.test.ExampleImp // import ๋ฌธ ์์ฑ
public class PackageImp {
public static void main(String[] args) {
ExampleImp x = new ExampleImp(); // ์ด์ ํจํค์ง ๋ช
์ ์๋ต ๊ฐ๋ฅ
}
}
์ด๋ ๊ฒ ์ฌ์ฉํ๋ฉด ํจํค์ง๋ช ์ ์๋ตํ๊ณ ํด๋์ค์ ๋ฐ๋ก ์ ๊ทผ์ด ๊ฐ๋ฅํ๋ค.
์ ๊ทผ์ ์ด์
์ ๊ทผ์ ์ด์๋ ๋ฉค๋ฒ ๋๋ ํด๋์ค์ ์ฌ์ฉ๋์ด ์ธ๋ถ์์ ์ ๊ทผํ์ง ๋ชปํ๋๋ก ์ ํํ๋ ์ญํ ์ ํ๋ค. ์๋ต์์๋ default๋ก ์ง์ ๋๊ณ ํด๋์ค,๋ฉค๋ฒ๋ณ์,๋ฉ์๋,์์ฑ์์ ์ง์ ์ด ๊ฐ๋ฅํ๋ค.
ํ๋ผ์ด๋น(private) : ๊ฐ์ ํด๋์ค ๋ด๋ถ์์๋ง ์ ๊ทผํ ์ ์๋ค.
๋ํดํธ(default) : ๊ฐ์ ํจํค์ง๋ด์์๋ง ์ ๊ทผ์ด ๊ฐ๋ฅํ๋ค.
ํ๋กํ ํฐ๋(protected) : ๊ฐ์ ํจํค์ง ๋ด์์ ์ ๊ทผํ ์ ์๋ค. ๋ค๋ฅธ ํด๋์ค์์๋ ์ ๊ทผํ ์ ์์ง๋ง, ์์ ๋ฐ์ ์์ ํด๋์ค์์๋ ์ ๊ทผ์ด ๊ฐ๋ฅํ๋ค.
ํผ๋ธ๋ฆญ(public) : ์ ๊ทผ ์ ํ์ด ์๋ค. ๋ค๋ฅธ ํจํค์ง, ๋ค๋ฅธ ํด๋์ค์์ ์ ๊ทผํ ์ ์๋ค.
getter / setter method
getter /setter ๋ฉ์๋๋ ๋ํ์ ์ผ๋ก private ์ ๊ทผ์๊ฐ ํฌํจ๋์ด์๋ ๊ฐ์ฒด์ ๋ณ์์ ๋ฐ์ดํฐ๊ฐ์ ์ถ๊ฐํ๊ฑฐ๋ ์์ ํ๊ณ ์ถ์๋ ๊ฐ๋ฅํ๊ฒ ํด์ค๋ค. setter๋ ๋ฐ์ดํฐ๊ฐ์ ๋ณ๊ฒฝํ ์์๊ฒ ํด์ฃผ๊ณ , getter๋ ์ค์ ํ ๋ณ์๊ฐ์ ์ฝ์ด์ค๋๋ฐ ์ฌ์ฉ๋๋ค.
์๋ ์ฝ๋๋ฅผ ์ฐธ๊ณ ํ์.
public class GetterSetterTest {
public static void main(String[] args) {
Worker w = new Worker();
w.setName("๊น์ฝ๋ฉ");
w.setAge(30);
w.setId(5);
String name = w.getName();
System.out.println("๊ทผ๋ก์์ ์ด๋ฆ์ " + name);
int age = w.getAge();
System.out.println("๊ทผ๋ก์์ ๋์ด๋ " + age);
int id = w.getId();
System.out.println("๊ทผ๋ก์์ ID๋ " + id);
}
}
class Worker {
private String name; // ๋ณ์์ ์๋ํ. ์ธ๋ถ๋ก๋ถํฐ ์ ๊ทผ ๋ถ๊ฐ
private int age;
private int id;
public String getName() { // ๋ฉค๋ฒ๋ณ์์ ๊ฐ
return name;
}
public void setName(String name) { // ๋ฉค๋ฒ๋ณ์์ ๊ฐ ๋ณ๊ฒฝ
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
if(age < 1) return;
this.age = age;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
}
// ์ถ๋ ฅ๊ฐ
๊ทผ๋ก์์ ์ด๋ฆ์ ๊น์ฝ๋ฉ
๊ทผ๋ก์์ ๋์ด๋ 30
๊ทผ๋ก์์ ID๋ 5
๐ํผ์์ ํด๊ฒฐํ๊ธฐ