π‘ λͺ©ν : μλ°μ μμμ λν΄ νμ΅ν΄λ³΄μ.
β‘οΈ λͺ©μ°¨
- μλ° μμμ νΉμ§
- super ν€μλ
- λ©μλ μ€λ²λΌμ΄λ©
- λ€μ΄λλ―Ή λ©μλ λμ€ν¨μΉ (Dynamic Method Dispatch)
- μΆμ ν΄λμ€
- final ν€μλ
- Object ν΄λμ€
μμ(inheritance)μ΄λ κΈ°μ‘΄μ ν΄λμ€μ κΈ°λ₯μ μΆκ°νκ±°λ μ¬μ μνμ¬ μλ‘μ΄ ν΄λμ€λ₯Ό μ μνλκ²μ μλ―Ένλ€. μ΄λ¬ν μμμ μΊ‘μν, μΆμνμ λλΆμ΄ κ°μ²΄ μ§ν₯ νλ‘κ·Έλλ°μ ꡬμ±νλ μ€μν νΉμ§ μ€ νλμ΄λ€. μμμ μ΄μ©νλ©΄ κΈ°μ‘΄μ μ μλμ΄ μλ ν΄λμ€μ λͺ¨λ νλμ λ©μλλ₯Ό λ¬Όλ €λ°μ, μλ‘μ΄ ν΄λμ€λ₯Ό μμ±ν μ μλ€.
super class
), μμ λ°λ μμ ν΄λμ€λ₯Ό μλΈ ν΄λμ€(sub class
)λΌκ³ νλ€.extends
ν€μλλ₯Ό μ¬μ©νλ€.public class Phone {
public void call() {
System.out.println("μ νλ₯Ό κ²λλ€...");
}
public void send() {
System.out.println("μ νλ₯Ό λ°μ΅λλ€...");
}
}
public class SmartPhone extends Phone {
//μμ μ μΈ (μ€λ§νΈν°μ μ νκΈ°λ₯Ό μμλ°λλ€.)
public void wifi() {
System.out.println("μμ΄νμ΄λ₯Ό μ°κ²°ν©λλ€...");
}
}
call()
, send()
κΈ°λ₯μ λ¬Όλ €λ°μΌλ―λ‘ μ€λ§νΈν° ν΄λμ€μμ λ©μλλ₯Ό λ€μ λ°λ³΅νμ¬ μμ±ν νμκ° μλ€.wifi()
λ©μλλ§ μμ±νλ©΄ λλ€.public class Ex01 {
public static void main(String[]args) {
Phone p1 = new Phone(); // μ νκΈ° κ°μ²΄ μμ±
p1.call();
p1.send();
SmartPhone p2 = new SmartPhone(); // μ€λ§νΈν° κ°μ²΄ μμ±
p2.call(); // μ€λ§νΈν° ν΄λμ€μμ μ νκΈ° ν΄λμ€μ λ©μλμ μ κ·Ό
p2.send();
p2.wifi(); // κΈ°λ₯ νμ₯
}
}
p1
, p2
μ΄λ€. p1
κ°μ²΄λ Phone ν΄λμ€
μ κΈ°λ₯λ§ κ°μ§κ³ p2
λ Phone ν΄λμ€
μ SmartPhone ν΄λμ€
μ κΈ°λ₯ λͺ¨λ κ°μ§ μ μλ€.extends
ν€μλ λ€μλ νλμ ν΄λμ€λ§ μ¬ μ μλ€.java.lang.Object
ν΄λμ€κ° μλ€.Object
ν΄λμ€λ₯Ό μλμΌλ‘ μμ λ°λλ‘ λμ΄μλ€.toString()
, equals()
μ κ°μ λ©μλλ₯Ό λ°λ‘ μ¬μ©ν μ μλ€.super
ν€μλλ λΆλͺ¨ ν΄λμ€λ‘λΆν° μμλ°μ νλλ λ©μλλ₯Ό μμ ν΄λμ€μμ μ°Έμ‘°νλλ° μ¬μ©νλ μ°Έμ‘° λ³μμ΄λ€. μΈμ€ν΄μ€ λ³μμ μ΄λ¦κ³Ό μ§μ λ³μμ μ΄λ¦μ΄ κ°μ κ²½μ° μΈμ€ν΄μ€ λ³μ μμ this
ν€μλλ₯Ό μ¬μ©νμ¬ κ΅¬λΆνλ κ²μ²λΌ, λΆλͺ¨ ν΄λμ€μ λ©€λ²μ μμ ν΄λμ€μ λ©€λ²κ° λμΌν κ²½μ° super
ν€μλλ₯Ό μ¬μ©νμ¬ κ΅¬λ³ν μ μκ³ , super
λ₯Ό μ¬μ©νμ¬ λΆλͺ¨ ν΄λμ€μ λ©€λ²μ μ κ·Ό ν μ μλ€. this
μ λ§μ°¬κ°μ§λ‘ super
μ°Έμ‘° λ³μλ₯Ό μ¬μ©ν μ μλ λμλ μΈμ€ν΄μ€ λ©μλ λΏμ΄λ©°, ν΄λμ€ λ©μλ(static)μμλ μ¬μ©ν μ μλ€.
class Parent {
int x = 10;
}
class Child extends Parent {
int x = 20;
void method() {
System.out.println("x = " + x);
System.out.println("this.x = " + this.x);
System.out.println("super.x = " + super.x);
}
}
public class SuperTest {
public static void main(String[]args) {
Child c = new Child();
c.method();
}
}
Output
x = 20
this. x = 20
super.x = 10
this
ν€μλλ νμ¬ μκΈ° μμ μ λ©€λ²μΈ x = 20μ λ°ννκ³ super
ν€μλλ λΆλͺ¨ ν΄λμ€μμ μμ λ°μ x = 10μ λ°ννλ€.
super()
λ μμ ν΄λμ€μ μμ±μμμ λΆλͺ¨ ν΄λμ€μ μμ±μλ₯Ό νΈμΆνκΈ° μν΄ μ¬μ©νλ€. μμ ν΄λμ€κ° μΈμ€ν΄μ€λ₯Ό μμ±νλ©΄ μΈμ€ν΄μ€ μμλ μμ ν΄λμ€μ κ³ μ λ©€λ² λΏλ§ μλλΌ λΆλͺ¨ ν΄λμ€μ λͺ¨λ λ©€λ²κΉμ§ ν¬ν¨λμ΄ μλ€. νμ§λ§ μμμμμ μμ±μλ μμλμ§ μλ μ μΌν λ©€λ² ν¨μμ΄λ€. λ°λΌμ λΆλͺ¨ ν΄λμ€μ λ©€λ²λ₯Ό μ΄κΈ°ν νκΈ° μν΄μ , λΉμ°ν λΆλͺ¨ ν΄λμ€μ μμ±μλ₯Ό νΈμΆν΄μΌ ν κ²μ΄λ€. μ¦, μμ ν΄λμ€μ λͺ¨λ μμ±μλ λΆλͺ¨ ν΄λμ€μ μμ±μλ₯Ό ν¬ν¨νκ³ μμ΄μΌ νλ€. κ·Έλ°λ° λ§μ½ μμ ν΄λμ€μ μμ±μμ λΆλͺ¨ ν΄λμ€μ μμ±μκ° μ μλμ΄ μμ§ μλ€λ©΄, μ»΄νμΌλ¬κ° μλμΌλ‘ λΆλͺ¨ ν΄λμ€μ κΈ°λ³Έ μμ±μλ₯Ό νΈμΆν΄μ€λ€. (μ΄λ¬ν κ²½μ°, λΆλͺ¨ ν΄λμ€μ 맀κ°λ³μκ° μλ μμ±μλ§ μκ³ κΈ°λ³Έ μμ±μκ° μμ΄ κΈ°λ³Έ μμ±μλ₯Ό νΈμΆ ν μ μλ€λ©΄ ? β‘οΈ μλ¬ λ°μ)[
public class Book { // λΆλͺ¨ ν΄λμ€
String title = "λ―Έμ
λ ₯";
int price = -1;
int code = 100;
public Book() {} // κΈ°λ³Έ μμ±μ
public Book (String title, int price) { //맀κ°λ³μκ° 2κ°μΈ μμ±μ
this.title = title;
this.price = price;
}
public void showPrice() {
System.out.println(title + " μ κ°κ²©μ " + price + "μ μ
λλ€.");
}
}
public class EnglishBook extends Book { // μμ ν΄λμ€
int code = 200;
public EnglishBook() {} // κΈ°λ³Έ μμ±μ
public EnglishBook(String title, int price) { //맀κ°λ³μκ° 2κ°μΈ μμ±μ
super(title, price);
}
public void showPrice() {
super.showPrice();
System.out.println("code : " + code);
System.out.println("this.code : " + this.code);
System.out.println("super.code : " + super.code); // λΆλͺ¨ ν΄λμ€μ code
System.out.println("price : " + price);
System.out.println("this.price : " + this.price);
System.out.println("super.price : " + super.price); // λΆλͺ¨ ν΄λμ€μ price
public class HelloWorld { // κ°μ²΄ μμ± λ° μ€ν
public static void main(String[]args) {
EnglishBook b1 = new EnglishBook("μμ΄μ±
", 10000);
b1.showPrice();
}
}
Output
code : 200
this.code : 200
super.code : 100
price : 10000
this.price : 10000
super.price : 10000
μ€λ²λΌμ΄λ©(overriding)μ΄λ λΆλͺ¨ ν΄λμ€λ‘λΆν° μμλ°μ λ©μλλ₯Ό μμ ν΄λμ€μμ μ¬μ μ νλ κ²μ΄λ€. μμλ°μ λ©μλλ₯Ό κ·Έλλ‘ μ¬μ©ν μλ μμ§λ§, μμ ν΄λμ€μμ μν©μ λ§κ² λ³κ²½ν΄μΌ νλ κ²½μ° μ€λ²λΌμ΄λ© ν νμκ° μκΈ΄λ€.
μ€λ²λΌμ΄λ©μ λΆλͺ¨ ν΄λμ€μ λ©μλλ₯Ό μ¬μ μ νλκ²μ΄λ―λ‘, μμ ν΄λμ€μμλ μ€λ²λΌμ΄λ© νκ³ μ νλ λ©μλμ μ΄λ¦, 맀κ°λ³μ, λ¦¬ν΄ κ°μ΄ λͺ¨λ κ°μμΌνλ€.
public class OverridingTest {
public static void main(String[]args) {
Animal animal = new Animal();
Dog dog = new Dog();
Cat cat = new Cat();
animal.cry();
dog.cry();
cat.cry();
}
}
class Animal {
void cry() {
System.out.println("λλ¬Όμ μΈμμ리");
}
}
class Dog extends Animal {
@Override
public void cry() {
System.out.println("λ©λ©");
}
}
class Cat extends Animal {
@Override
public void cry() {
System.out.println("μΌμΉ");
}
}
Output
λλ¬Όμ μΈμμ리
λ©λ©
μΌμΉ
μ€λ²λ‘λ©κ³Ό μ€λ²λΌμ΄λ©μ μ΄λ¦μ΄ λΉμ·ν λΏ μ ν λ€λ₯Έ μν μ νλ€.
κ΅¬λΆ | Overriding | Overloading |
---|---|---|
μ κ·Όμ μ΄μ | λΆλͺ¨ ν΄λμ€μ λ©μλμ μ κ·Ό μ μ΄μλ³΄λ€ λ λμ λ²μμ μ κ·Ό μ μ΄μλ₯Ό μμ ν΄λμ€μ λ©μλμμ μ€μ ν μ μλ€. | λͺ¨λ μ κ·Όμ μ΄μλ₯Ό μ¬μ© ν μ μλ€. |
리ν΄ν | λμΌν΄μΌ νλ€ | λ¬λΌλ λλ€ |
λ©μλλͺ | λμΌν΄μΌ νλ€ | λμΌν΄μΌ νλ€ |
맀κ°λ³μ | λμΌν΄μΌ νλ€ | λ¬λΌμΌλ§ νλ€ |
μ μ©λ²μ | μμκ΄κ³μμ μ μ©λλ€ | κ°μ ν΄λμ€ λ΄μμ μ μ©λλ€ |
λ€μ΄λλ―Ή λ©μλ λμ€ν¨μΉλ μ€λ²λΌμ΄λ λ λ©μλμ λν νΈμΆμ΄ μ»΄νμΌ νμμ΄ μλ, λ°νμμ κ²°μ λλ 맀컀λμ¦ μ΄λ€. μ€λ²λΌμ΄λ λ λ©μλκ° λΆλͺ¨ ν΄λμ€ μ°Έμ‘° κ°μ²΄μ μν΄ νΈμΆ λ λ, μλ°λ μ°Έμ‘° λ³μμ μ νμ΄ μλ νΈμΆ μ μ°Έμ‘°λλ κ°μ²΄μ λ°λΌ μ€νλλ λ©μλμ λ²μ (μνΌ / μλΈ ν΄λμ€)μ κ²°μ νλ€. λ°λΌμ, μ΄ κ²°μ μ λ°νμμ μ΄λ£¨μ΄μ§λ€. μνΌ ν΄λμ€ μ°Έμ‘° λ³μλ μλΈ ν΄λμ€ κ°μ²΄λ₯Ό μ°Έμ‘°ν μ μμΌλ©° μ΄λ₯Ό μ
μΊμ€ν
μ΄λΌκ³ νλ€. μνΌ ν΄λμ€κ° μλΈ ν΄λμ€μ μν΄ μ¬μ μλλ λ©μλλ₯Ό ν¬ν¨νλ κ²½μ°, μνΌ ν΄λμ€ μ°Έμ‘° λ³μλ₯Ό ν΅ν΄ μλ‘ λ€λ₯Έ μ νμ κ°μ²΄λ₯Ό μ°Έμ‘°ν λ μλ‘ λ€λ₯Έ λ²μ μ λ©μλκ° μ€νλλ€.
μ½λλ₯Ό 보면 overridingμ ν΅ν΄ λ©μλλ₯Ό μ¬μ μ ν΄λκ³ , λ©μΈ ν¨μμμ λμΌν μ΄λ¦μ λ©μλλ₯Ό νΈμΆνκ³ μλ€. κ²°κ³Όλ?
static class Super {
void print() {
System.out.println("super's print");
}
}
static class Sub1 extends Super {
@Override
void print() {
System.out.println("sub1's print");
}
}
static class Sub2 extends Super {
@Override
void print() {
System.out.println("sub2's print");
}
}
public static void main(String[]args) {
Super reference = new Super(); // 1)
reference.print();
reference = new Sub1(); // 2)
reference.print();
reference = new Sub2(); // 3)
reference.print();
}
Super νμ
μ κ°μ²΄μΈ referenceμ μμ κ°μ²΄μΈ Sub1κ³Ό Sub2λ₯Ό λμ
νλ©΄ upcastingμ΄ μ΄λ£¨μ΄μ§κ³ , referenceλ λμ
λ λ λ§λ€ μμ κ°μ²΄μ μ£Όμλ₯Ό κ°λ₯΄ν€κ² λλ€. νΌλμ΄ μμκΉ μΈκΈνμλ©΄, referenceκ° 3κ°μ κ°μ²΄λ₯Ό λͺ¨λ κ°λ₯΄ν€λ κ²μ΄ μλλΌ λμ
λ λ λ§λ€ μμλλ‘ κ°λ₯΄ν€κ² λλ€.
Output
super's print
sub1's print
sub2's print
μΆλ ₯μμ μ μ μλ―μ΄, μ€νλλ λ©μλμ λ²μ μ νΈμΆ μ μ°Έμ‘°λλ κ°μ²΄μ μ νμ λ°λΌ κ²°μ λλ€. μ΄μ²λΌ Super νμ μ reference μ°Έμ‘° λ³μκ° μ»΄νμΌ μ νμ (Super)μ΄ μλ, λ°νμ μ μ°Έμ‘°λλ κ°μ²΄μ νμ μ λ°λΌ μ€λ²λΌμ΄λ λ λ©μλμ λ²μ μ κ²°μ νλ κ²μ΄ λ€μ΄λλ―Ή λ©μλ λμ€ν¨μΉ λΌκ³ λΆλ₯Έλ€. λ¨ μ£Όμν μ μ΄ μλ€! μλ°μμ λ³μκ° μλ λ©μλλ§ μ€λ²λΌμ΄λκ° κ°λ₯ν κ²μ²λΌ, λ°νμ λ€νμ±μ λ°μ΄ν° λ©€λ² λ³μμμλ 보μ₯λμ§ μλλ€.
class A {
int x = 10;
}
class B extends A {
int x = 20;
}
public class Test {
public static void main(String[]args) {
A a = new B();
System.out.println(a.x);
}
}
Output
10
A νμ μ μ°Έμ‘°λ³μ aμ, B κ°μ²΄λ₯Ό ν λΉν ν a λ³μμ x κ°μ μΆλ ₯νλ νλ‘κ·Έλ¨μ΄λ€. B κ°μ²΄λ₯Ό ν λΉ νμκΈ° λλ¬Έμ 20μ΄ μΆλ ₯λ κ²μΌλ‘ μμνμ§λ§, 10μ΄ μΆλ ₯λμλ€ μμΌκΉ ? μ΄λ μμ λ§ν λ°νμ λ€νμ±μ λ°μ΄ν° λ©€λ² λ³μμλ 보μ₯λμ§ μκΈ° λλ¬Έμ΄λ€. λ°λΌμ a.xλ νμ μνΌ ν΄λμ€μ λ°μ΄ν° λ³μλ₯Ό μ°Έμ‘°νκ² λλ€.
μΆμ ν΄λμ€λ 무μμΌκΉ ? μ½κ² μ€λͺ νμλ©΄ μ¬λ¬ ν΄λμ€λ€μμ 곡ν΅μ μΌλ‘ μ¬μ©λλ λ©μλμ λͺ¨μμ§μ΄λΌκ³ μκ° ν μ μκ² λ€. μλ₯Ό λ€μ΄λ³΄μ μ¬λ μΌκ΅΄μ λͺ¨λ λ€λ₯΄μ§λ§ λ λκ°, μ½ νλ, μ νλλ₯Ό 곡ν΅μ μΌλ‘ κ°μ§κ³ μλ€. μ¬κΈ°μ AλΌλ μ¬λμ λ, μ½, μ μ κ°μ§κ³ μκ³ , λ§μ°¬κ°μ§λ‘ BλΌλ μ¬λλ λ, μ½, μ μ κ°μ§κ³ μμ κ²μ΄λ€. μ΄μ Aμ BλΌλ μ¬λμ ν΄λμ€λ‘ λ³΄κ³ λ, μ½, μ μ λ³μλ‘ λ³΄μ. Aμ Bλ λλ€ μλ νλμ ν μ μλ€. AλΌλ μ¬λμ νν μμ§λ§, BλΌλ μ¬λμ ν€ν€ νκ³ μλλ€ λμ κ°μμ μμ μ리λλ‘ μμ§λ§, 곡ν΅μ μΌλ‘ μλλ€ λΌλ μ‘μ μ μ·¨νκ³ μλ€. μ΄λ 곡ν΅μ μΈ λ©μλκ° λλ€. λ°λΌμ μΆμ ν΄λμ€μ ν΄λΉ λ©μλλ₯Ό λ£μ μ μλ€. μ 리λ₯Ό ν΄λ³΄λ©΄ μΆμ ν΄λμ€λ μ€μ²΄ ν΄λμ€μ 곡ν΅μ μΈ λΆλΆμ μΆμΆν΄ μ΄λμ λ κ·κ²©λ§ μ‘μλλ μΆμμ μΈ ν΄λμ€μ΄λ€. μΆμ ν΄λμ€λ λ©μλμ λ΄μ©μ΄ μΆμμ μ΄κΈ° λλ¬Έμ κ°μ²΄λ₯Ό μμ±ν μ μλ€ κ·ΈλΌ μ΄λ»κ² μ¬μ©ν κΉ ? μ€μ²΄ ν΄λμ€μμ μΆμ ν΄λμ€λ₯Ό μμλ°μ μΆμμ μ΄μλ ν΄λμ€λ₯Ό ꡬ체ν μν€λ©°(μμ μ리 = νν, ν€ν€..) μ¬μ©νλ€! μλ‘ μ΄ κΈΈμλ€,, μμλ₯Ό μ½λλ‘ λ³΄μ!
abstract class Person { //μΆμ ν΄λμ€
abstract void smile(); //μΆμ λ©μλ -> λ΄μ©μ μ μ νμ§ μλλ€.
}
public class A extends Person { // μΆμ ν΄λμ€λ₯Ό μμλ°μ μ€μ²΄ ν΄λμ€λ₯Ό λ§λ¦
@Override
public void smile() {
System.out.println("νν"); // μΆμ λ©μλλ₯Ό ꡬ체ν μν¨λ€. -> λ€νμ±
}
}
public class B extends Person { // μΆμ ν΄λμ€λ₯Ό μμλ°μ μ€μ²΄ ν΄λμ€λ₯Ό λ§λ¦
@Override
public void smile() {
System.out.println("ν€ν€"); // μΆμ λ©μλλ₯Ό ꡬ체ν μν¨λ€. -> λ€νμ±
}
}
public class Main {
public static void main(String[]args) {
A personA = new A();
personA.smile();
B personB = new B();
personB.smile();
}
}
Output
νν
ν€ν€
μ΄ν΄κ° μ‘°κΈ λμκΈΈ λ°λΌλ©° μΆμ ν΄λμ€μ λν΄ λ€μ νλ² μ 리λ₯Ό ν΄λ³΄μ.
μλ°μμλ νλ μ΄μμ μΆμ λ©μλλ₯Ό ν¬ν¨νλ ν΄λμ€λ₯Ό μΆμ ν΄λμ€λΌκ³ νλ€. μ΄λ¬ν μΆμ ν΄λμ€λ κ°μ²΄ μ§ν₯ νλ‘κ·Έλλ°μμ μ€μν νΉμ§μΈ λ€νμ±μ κ°μ§λ λ©μλμ μ§ν©μ μ μν μ μλλ‘ ν΄μ€λ€. μ¦, λ°λμ μ¬μ©λμ΄μΌ νλ λ©μλλ₯Ό μΆμ ν΄λμ€μ μΆμ λ©μλλ‘ μ μΈν΄ λμΌλ©΄, μΆμ ν΄λμ€λ₯Ό μμλ°λ λͺ¨λ ν΄λμ€μμλ μΆμ λ©μλλ₯Ό λ°λμ μ¬μ μ ν΄μΌνλ€. μΆμ ν΄λμ€λ λμμ΄ μ μλμ΄ μμ§ μμ μΆμ λ©μλλ₯Ό ν¬ν¨ νκ³ μμΌλ―λ‘, μΈμ€ν΄μ€λ₯Ό μμ±ν μ μλ€. μΆμ ν΄λμ€λ λ¨Όμ μμμ ν΅ν΄ μμ ν΄λμ€λ₯Ό λ§λ€κ³ , λ§λ μμ ν΄λμ€μμ μΆμ ν΄λμ€μ λͺ¨λ μΆμ λ©μλλ₯Ό μ€λ²λΌμ΄λ©νκ³ λμμΌ λΉλ‘μ μμ ν΄λμ€μ μΈμ€ν΄μ€λ₯Ό μμ±ν μ μλ€.
final ν€μλλ λ³μ(variable), λ©μλ(Method), λλ ν΄λμ€(class)μ μ¬μ©λ μ μλ€. μ΄ final ν€μλλ μ΄λ€ κ³³μ μ¬μ©λλλμ λ°λΌ λ€λ₯Έ μλ―Έλ₯Ό κ°μ§λ€. νμ§λ§ final ν€μλλ₯Ό λΆμ΄λ©΄ 무μΈκ° μ ννλ€λ μλ―Έλ₯Ό κ°μ§λ κ²μ 곡ν΅μ μΈ μ±κ²©μ΄λ€.
λ‘컬 μμ λ³μμ finalλ‘ μ μΈνλ©΄ νλ² μ΄κΈ°νλ λ³μλ λ³κ²½ν μ μλ μμκ°μ΄ λλ€.
public void primitiveVariables() {
final int x = 1;
x = 3; // νλ² assignλλ©΄ λ³κ²½ν μ μλ€.
}
κ°μ²΄ λ³μμ finalλ‘ μ μΈνλ©΄ κ·Έ λ³μμ λ€λ₯Έ μ°Έμ‘° κ°μ μ§μ ν μ μλ€. μμ νμ κ³Ό λμΌνκ² νλ² μ°μ¬μ§ λ³μλ μ¬λ³κ²½μ΄ λΆκ°νλ€. λ¨ κ°μ²΄ μμ²΄κ° immutableνλ€λ μλ―Έλ μλλ€. κ°μ²΄μ μμ±μ λ³κ²½ κ°λ₯νλ€.
public void referenceVariables() {
final Pet pet = new Pet();
pet = new Pet(); // λ€λ₯Έ κ°μ²΄λ‘ λ³κ²½ν μ μμ.
per.setWeight(3); // κ°μ²΄ νλλ λ³κ²½ κ°λ₯.
}
λ©μλ μΈμμ final ν€μλλ₯Ό λΆμ΄λ©΄, λ©μλ μμμ λ³μ κ°μ λ³κ²½ ν μ μλ€.
public class Pet {
int weight;
public void setWeight(final int weight) {
weight = 1; //final μΈμλ λ©μλ μμμ λ³κ²½ν μ μλ€.
}
}
ν΄λμ€μ νλμ finalλ‘ μ μΈνλ©΄ μμκ°μ΄ λκ±°λ write-once νλλ‘ νλ²λ§ μ°μ΄κ² λλ€. finalλ‘ μ μΈνλ©΄ μ΄κΈ°ν λλ μμ μ μμ±μ λ©μλκ° λλκΈ° μ μ μ΄κΈ°ν λλ€. νμ§λ§ staticμ΄λ μλλμ λ°λΌμλ μ΄κΈ°ν μμ μ΄ λ¬λΌμ§λ€.
μΈμ€ν΄μ€ μ΄κΈ°ν λΈλ | μ μ μ΄κΈ°ν λΈλ |
---|---|
κ°μ²΄ μμ±ν λλ§λ€ λΈλμ΄ μ€νλλ€ | |
λΆλͺ¨ μμ±μ μ΄νμ μ€νλλ€ | ν΄λμ€ λ‘λμ νλ²λ§ λΈλμ΄ μμ±λλ€ |
μμ±μλ³΄λ€ λ¨Όμ μ€νλλ€ |
λ©μλλ₯Ό finalλ‘ μ μΈνλ©΄ μμλ°μ ν΄λμ€μμ μ€λ²λΌμ΄λκ° λΆκ°λ₯ νκ² λλ€. μλ₯Όλ€μ΄, DogλΌλ κ°μ²΄λ Pet ν΄λμ€ μμ finalλ‘ μ μΈλ makeSound() λ©μλλ₯Ό μ¬μ μ ν μ μλ€. κ·Έλ λ€λ©΄ final λ©μλλ μΈμ μ¬μ©νλ©΄ μ’μκΉ ? ꡬνν μ½λμ λ³κ²½μ μμΉ μμ λ μ¬μ©νλ€. side-effectκ° μμΌλ©΄ μλλ μλ° μ½μ΄ λΌμ΄λΈλ¬λ¦¬μμ finalλ‘ μ μΈλ λΆλΆμ λ§μ΄ μ°Ύμ μ μλ€.
public class Pet {
public final void makeSound() { //final μ¬μ©
System.out.println("ahaha");
}
}
public class Dog extends Pet {
//finalλ‘ μ μΈλ λ©μλλ Override ν μ μλ€.
public void makeSound() { }
}
ν΄λμ€μ finalμ μ μΈνλ©΄ μμ μμ²΄κ° μλλ€. κ·Έλ₯ ν΄λμ€ κ·Έλλ‘λ§ μ¬μ©ν΄μΌ νλ€. Util νμμ ν΄λμ€λ μ¬λ¬ μμ κ°μ λͺ¨μλ Constants ν΄λμ€λ₯Ό finalλ‘ μ μΈνλ€.
public final class Constants {
public static final SIZE = 0;
}
public class SubConstants extends Constants {
// μμ κ°μ λͺ¨μλμ ν΄λμ€λ₯Ό κ΅³μ΄ μμν΄μ μΈ μ΄μ λ μλ€
}
μλ°μμλ μμμ΄λ νμμ μ΄λ€. μ°λ¦¬κ° μμμ ν건 νμ§ μμ건 κΈ°λ³Έμ μΌλ‘ μμμ νκ²λλ€. 무μ¨λ§μΌκΉ ?
class Obj { }
// μ μ½λλ μλ μ½λμ λμΌνλ€.
class Obj extends Object { }
μλ°μμ λͺ¨λ ν΄λμ€λ μ¬μ€ Objectλ₯Ό μμμ μΌλ‘ μμλ°κ³ μλ κ²μ΄λ€. κ·Έλ° μ μμ Objectλ λͺ¨λ ν΄λμ€μ μ‘°μμ΄λΌκ³ ν μ μλ€. κ·Έ μ΄μ λ λͺ¨λ ν΄λμ€κ° 곡ν΅μΌλ‘ ν¬ν¨νκ³ μμ΄μΌ νλ κΈ°λ₯μ μ 곡νκΈ° μν΄μλ€ API λ¬Έμμ λ©μλμ λͺ©λ‘μ μ΄ν΄λ³΄μ.
μ κ·Έλ¦Όμ Object ν΄λμ€κ° κ°μ§κ³ μλ λ©μλλ₯Ό 보μ¬μ€λ€. λ€μ λ§ν΄μ μλ°μ κ°μ²΄λ μμ λ©μλλ€μ λ°λμ κ°μ§κ³ μλ€κ³ ν μ μλ€. μ΄ μ€μμ λͺκ°μ§ μ€μν API λ€μ μ΄ν΄λ³΄μ.
class Calculator {
int right;
int left;
public void setOprands(int left, int right) {
this.left = left;
this.right = right;
}
public void sum() {
System.out.println(this.left + this.right;
}
public class CalculatorDemo {
public static void main(String[]args) {
Calculator c1 = new Calculator();
c1.setOprands(10, 20);
System.out.println(c1);
}
}
Output
Calculator@6d06d69c
(@ λ€μ λ΄μ©μ κ°μ λ€λ₯Ό κ²μ΄λ€.)
μ€νκ²°κ³Όλ c1μ΄ ν΄λμ€ Calculator
μ μΈμ€ν΄μ€λΌλ μλ―Έλ€. @ λ€μ λ΄μ©μ μΈμ€ν΄μ€μ λν κ³ μ ν μλ³κ° μ λλ‘ μκ°νμ. νμ§λ§ μ΄ μ€νκ²°κ³Όλ μ°λ¦¬κ° μνλ κ²°κ³Όκ° μλκ²μ΄λ€. κ·ΈλΌ toStringμ μ¬μ©ν΄ μ μ©ν κ²°κ³Όλ₯Ό λ§λ€μ΄λ³΄μ.
class Calculator {
int right;
int left;
public void setOprands (int left, int right) {
this.left = left;
this.right = right;
}
public void sum() {
System.out.println(this.left + this.right;
}
public String toString() {
return "left : " + this.left + ", right : "+ this.right;
}
public class CalculatorDemo {
public static void main(String[]args) {
Calculator c1 = new Calculator();
c1.setOprands(10, 20);
System.out.println(c1);
System.out.println(c1.toString());
}
}
Output
left : 10, right : 20
left : 10, right : 20
ν΄λμ€ Calculator
μ toString()
μ μ¬μ μ(overriding)νλ€. κ·Έλ¦¬κ³ System.out.println
μ μΈμλ‘ μ λ¬νλκΉ toString()
μ λͺ
μμ μΌλ‘ νΈμΆνμ§ μμμμλ λμΌν ν¨κ³Όκ° λκ³ μλ€. toString()
λ©μλλ μλ°μμ νΉλ³ν μ·¨κΈνλ λ©μλλ€. toString()
μ μ§μ νΈμΆνμ§ μμλ μ΄λ€ κ°μ²΄λ₯Ό System.out.println
λ‘ νΈμΆνλ©΄ μλμΌλ‘toString()
μ΄ νΈμΆλλλ‘ μ½μλμ΄ μλ€. μ΄λ₯Ό ν΅ν΄ μΈμ€ν΄μ€ c1μ μνλ₯Ό μ½κ² νμ
ν μ μκ² λμλ€.
equalsλ κ°μ²΄μ κ°μ²΄κ° κ°μ κ²μΈμ§ λΉκ΅νλ APIμ΄λ€. κ°μ²΄ κ°μ κ°κ³ λ€λ¦μ νμμ λ°λΌ λ¬λΌμ§ μ μκΈ° λλ¬Έμ΄λ€.
class Student {
String name;
Student(String name) {
this.name = name;
}
public boolean equals(Object obj) {
Student _obj = (Student)obj;
return name == _obj.name;
}
}
class ObjectDemo {
public static void main(String[]args) {
Student s1 = new Student("pie");
Student s2 = new Student("pie");
1. System.out.println(s1==s2);
2. System.out.println(s1.equals(s2));
}
}
Output
false
true
μ¬κΈ°μ μ£Όλͺ©ν΄μΌ ν μ μ 1.System.out.println(s1==s2)
μ΄λ€. κ²°κ³Όλ false
. κ·Έ μ΄μ λ s1κ³Ό s2κ° μλ‘ λ€λ₯Έ κ°μ²΄μ΄κΈ° λλ¬Έμ΄λ€. νμ§λ§ λ κ°μ²΄λ λ
Όλ¦¬μ μΌλ‘λ pie
λΌλ κ°μ κ°μ§κ³ μκΈ° λλ¬Έμ κ°μ²΄λ₯Ό λ§λ κ°λ°μλ μ λκ°μ κ°μ²΄κ° κ°μ κ°μ²΄λ‘ κ°μ£Ό λμμ μ’κ² λ€. μ΄λ΄ λ ν΄λμ€ Object
μ λ©μλ equals()
λ₯Ό overriding νλ©΄ λμ§λ§, equalsλ₯Ό μ λλ‘ μ¬μ©νκΈ° μν΄μ hashCodeλΌλ ν΄λμ€λ ν¨κ» ꡬνν΄μΌ νλλ° λ무 볡μ‘νκ³ λ¬΄κ±°μ΄ λ΄μ©μ΄λ λ€μ λ΄μ©λ§ μ κΈ°μ΅νμ.
1. λ
Όλ¦¬μ (μ μ₯νκ³ μλ λ°μ΄ν°)μΌλ‘ λλ±νμ§ νμΈνκ³ μΆμΌλ©΄ equals()
λ₯Ό μ¬μ©νμ.
2. 물리μ (κ°μ κ°μ²΄λ₯Ό μ°Έμ‘°νκ³ μλμ§)μΌλ‘ λλ±νμ§ νμΈνκ³ μΆμΌλ©΄ ==
λ₯Ό μ¬μ©νμ.
λ©μλ | μ€ λͺ |
---|---|
protected Object clone() | ν΄λΉ κ°μ²΄μ 볡μ λ³Έμ μμ±νμ¬ λ°νν¨. |
boolean equals(Object obj) | ν΄λΉ κ°μ²΄μ μ λ¬λ°μ κ°μ²΄κ° κ°μμ§ μ¬λΆλ₯Ό λ°νν¨. |
protected void finalize() | ν΄λΉ κ°μ²΄λ₯Ό λλ μ무λ μ°Έμ‘°νμ§ μμ κ°λΉμ§ 컬λ ν°κ° κ°μ²΄μ 리μμ€λ₯Ό μ 리νκΈ° μν΄ νΈμΆν¨. |
Class getClass() | ν΄λΉ κ°μ²΄μ ν΄λμ€ νμ μ λ°νν¨. |
int hashCode() | ν΄λΉ κ°μ²΄μ ν΄μ μ½λκ°μ λ°νν¨. |
void notify() | ν΄λΉ κ°μ²΄μ λκΈ°(wait)νκ³ μλ νλμ μ€λ λλ₯Ό λ€μ μ€νν λ νΈμΆν¨. |
void notifyAll() | ν΄λΉ κ°μ²΄μ λκΈ°(wait)νκ³ μλ λͺ¨λ μ€λ λλ₯Ό λ€μ μ€νν λ νΈμΆν¨. |
String toString() | ν΄λΉ κ°μ²΄μ μ 보λ₯Ό λ¬Έμμ΄λ‘ λ°νν¨. |
void wait() | ν΄λΉ κ°μ²΄μ λ€λ₯Έ μ€λ λκ° notify()λ notifyAll() λ©μλλ₯Ό μ€νν λκΉμ§ νμ¬ μ€λ λλ₯Ό μΌμμ μΌλ‘ λκΈ°(wait)μν¬ λ νΈμΆν¨. |
void wait(long timeout) | ν΄λΉ κ°μ²΄μ λ€λ₯Έ μ€λ λκ° notify()λ notifyAll() λ©μλλ₯Ό μ€ννκ±°λ μ λ¬λ°μ μκ°μ΄ μ§λ Β λκΉμ§ νμ¬ μ€λ λλ₯Ό μΌμμ μΌλ‘ λκΈ°(wait)μν¬ λ νΈμΆν¨. |
void wait(long timeout, int nanos) | ν΄λΉ κ°μ²΄μ λ€λ₯Έ μ€λ λκ° notify()λ notifyAll() λ©μλλ₯Ό μ€ννκ±°λ μ λ¬λ°μ μκ°μ΄ μ§λκ±°λ λ€λ₯Έ μ€λ λκ° νμ¬ μ€λ λλ₯Ό μΈν°λ½νΈ(interrupt) ν λκΉμ§ νμ¬ μ€λ λλ₯Ό μΌμμ μΌλ‘ λκΈ°(wait)μν¬ λ νΈμΆν¨. |
μ΄λ²μ£Όλ μ΄μ¬ν ν λ,, κ²°κ³Όλ 체λ ₯ κ³ κ°,,,
[μΆμ²]
https://hyoje420.tistory.com/14
https://velog.io/@sewonkim/Java-μλ°μ-μμ-λ€μ΄λλ―Ή-λ©μλ-λμ€ν¨μΉ-Dynamic-Method-Dispatch
http://www.tcpschool.com/java/java_api_object
https://opentutorials.org/module/516/6241
https://kephilab.tistory.com/92