์ธํฐํ์ด์ค(interface)๋?
ํด๋์ค๋ฅผ ์ํ ํฌํ๋ฆฟ์ผ๋ก์์ ๊ธฐ๋ฅ์ ์ํํ๋ ์ถ์ ํด๋์ค์ ํ ์ข ๋ฅ
- ์ธํฐํ์ด์ค๋ interface๋ผ๋ ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ธํ๋ฉฐ, ๋ฉ์๋ ์๊ทธ๋์ฒ์ ์์ ์ ์ธ(static๊ณผ final์ด ๋ ๋ค ์ ์ธ๋๋ ๋ณ์ ์ ์ธ)๋ง์ ํฌํจํ ์ ์๋ค.
- ์๋ฐ 8๋ฏธ๋ง์ ์ธํฐํ์ด์ค๋ ๋ชจ๋ ๋ฉ์๋๊ฐ ์ ์ธ๋ง ์๊ณ ์ ์๊ฐ ์๋ ์ถ์ ๋ฉ์๋๋ง ์ ์ธ ๊ฐ๋ฅ
- ์ธํผํ ์ด์ค ๋ด์ ํ๋๋ ์์ ์ ์ธ๋ง ํ๋ค.
- ํด๋์ค์์ ์ธํฐํ์ด์ค ๊ตฌํํ๊ธฐ ์ํด์๋ implementsํ ํด๋์ค๋ ํด๋น ์ธํฐํ์ด์ค์ ๋ชจ๋ ์ถ์ ๋ฉ์๋๋ฅผ ์ฌ์ ์ ํด์ผ ํ๋ค.
- ์ธํฐํ์ด์ค๋ ๋ค์ค ์์์ด ๊ฐ๋ฅํจ. ๋ค์ค ์์์ ","(์ฝค๋ง)๋ก ๊ตฌ๋ถํ์ฌ ์ฌ๋ฌ ๊ฐ์ ์ธํฐํ์ด์ค๋ฅผ ์์ํ ์ ์๋ค.
- ์ธํฐํ์ด์ค๋ผ๋ฆฌ ์์ ํ ๊ฒฝ์ฐ extends ํค์๋๋ฅผ ์ฌ์ฉํ๋ค.
- โถ ํน์ง
- ํด๋์ค๊ฐ ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถ ์ ์๋ค.
- ํ์คํ๊ฐ ๊ฐ๋ฅ
- ๊ฐ๋ฐ์๊ฐ์ ๋จ์ถํ ์ ์๋ค.

์ธํฐํ์ด์ค ๋ฉค๋ฒ
โถ ์์ ํ๋ (constant field)
- ์ธํฐํ์ด์ค๋ ์์ ํ๋๋ง ์ ์ธ ๊ฐ๋ฅํ๋ฉฐ, ๋ฐํ์ ์ ๋ณ๊ฒฝ ํ ์ ์๋ค.
- ์์ ํ๋๋ public final static๋ง ๊ฐ๋ฅํ๋ฉฐ, public final static๋ฅผ ์๋ต ํ ์ ์์ง๋ง ์๋ตํด๋ ๋ค์๊ณผ ๊ฐ๋ค.
- public final static ์๋ฃํ ํ๋๋ช = ์ด๋ฆฌ๊ฐ;
- static {} ์ด๊ธฐํ ๋ธ๋ก์ผ๋ก ์ด๊ธฐํ๊ฐ ๋ถ๊ฐ๋ฅํ๋ฉฐ ์์ ํ๋๋ฅผ ์ ์ธํ๋ฉด์ ์ด๊ธฐํ ํด์ผ ํ๋ค.
โถ ์ถ์ ๋ฉ์๋(abstract method)
- ์๋ฐ 8๋ฏธ๋ง์ ์ธํฐํ์ด์ค๋ ๋ชจ๋ ๋ฉ์๋๊ฐ ์ ์ธ๋ง ์๊ณ ์ ์๊ฐ ์๋ ์ถ์ ๋ฉ์๋๋ง ์ ์ธ ๊ฐ๋ฅ
- ์ ๊ทผ์ ์ด์์ ์๋ต์ ๊ฐ๋ฅํ์ง๋ง, ๊ธฐ์ ํ๋ ๊ฒฝ์ฐ์๋ public๋ง ๊ฐ๋ฅ
- ์ถ์๋ฉ์๋์ public abstract ํค์๋๋ฅผ ๋ถ์ด์ง ์์๋ ๋ค์๊ณผ ๊ฐ๋ค. public abstract ๋ฆฌํดํ์ ๋ฉ์๋๋ช ([์ธ์]);
- ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ํด๋์ค๋ ์ถ์ ํด๋์ค๊ฐ ์๋ ๊ฒฝ์ฐ ์ธํฐํ์ด์ค์ ๋ชจ๋ ์ถ์ ๋ฉ์๋๋ฅผ ์ฌ์ ์ ํด์ผ ํ๋ค.
โถ ๋ํดํธ ๋ฉ์๋(default method)
- ์๋ฐ 8๋ถํฐ ์ฌ์ฉ ๊ฐ๋ฅ
- ๋ํดํธ ๋ฉ์๋๋ ์ธํฐํ์ด์ค์ ์ ์ธ๋์ง๋ง, ์ ์๊ฐ ๋ ๋ฉ์๋๋ก ๊ตฌํํด๋์ค์์ ์ฌ์ ์๊ฐ ๊ฐ๋ฅํ๋ค.
- ๋ํดํธ ๋ฉ์๋๊ฐ ํ์ฉ๋ ์ด์ ๋ ๊ธฐ์กด ์ธํฐํ์ด์ค๋ฅผ ํ์ฅํด์ ์๋ก์ด ๊ธฐ๋ฅ์ ์ถ๊ฐํ ๋ชฉ์
โถ ์ ์ ๋ฉ์๋(static method)
- ์๋ฐ 8๋ถํฐ ์ฌ์ฉ ๊ฐ๋ฅ
- ๋ํดํธ ๋ฉ์๋์ ๋ฌ๋ฆฌ ๊ฐ์ฒด๊ฐ ์์ด๋ ์ธํฐํ์ด์ค๋ง์ผ๋ก ํธ์ถ์ด ๊ฐ๋ฅํ๋ค.
โถprivate ๋ฉ์๋
- ์๋ฐ 9๋ถํฐ๋ private ๋ฉ์๋๋ฅผ ์ ์ ํ ์ ์๋ค.
package ch08.unit06;
public class Ex01 {
public static void main(String[] args) {
// Demo1 d = new Demo1 (); // ์ปด์ค๋ฅ
// ์ธํฐํ์ด์ค๋ ์ถ์ ํด๋์ค์ ์ผ์ข
์ผ๋ก ๊ฐ์ฒด ์์ฑ ๋ถ๊ฐ
// ์ธํฐํ์ด์ค๋ ๊ตฌํํด๋์ค์ ์์ ํด๋์ค์ ์ ์ฌ
Demo1 dm = new Test1(); // ์
์บ์คํ
dm.disp();
// dm.sub(); // ์ปด์ค๋ฅ
((Test1) dm).sub(); // ๋ค์ด์บ์คํ
System.out.println(Demo1.A);
// Demo1.B = 200 ; // ์ปด์ค๋ฅ final ํ๋๋ ๊ฐ ๋ณ๊ฒฝ ๋ถ๊ฐ
}
}
//์ธํฐํ์ด์ค๋ ๋ฉ์๋๊ฐ ์ ์ธ๋ง ์๊ณ ์ ์๊ฐ ์๋ abstract ํด๋์ค์ ์ผ์ข
interface Demo1 {
public static final int A = 10;
int B = 20; // ํ๋๋ public static final์ ๋ถ์ด์ง ์์๋ public static final๋จ
// ์ธํฐํ์ด์ค ๋ฉ์๋ public abstract๋ง ๊ฐ๋ฅ
public abstract void disp();
void print(); /// ๋ฉ์๋๋ public abstract๋ฅผ ๋ถ์ด์ง ์์๋ public abstract๋จ
// public void write() {} // ์ปด์ค๋ฅ ์ธํฐํ์ด์ค์์ ๋ฉ์๋์ ๊ตฌํ์ ๋ถ๊ฐ
}
// ์ธํฐํ์ด์ค ๊ตฌํ
// ์ธํฐํ์ด์จ๋ฅผ ๊ตฌํํ๋ ํด๋์ค๋ ์ถ์ํด๋์ค๊ฐ ์๋ ๊ฒฝ์ฐ์๋ ์ธํฐํ์ด์ค์
// ๋ชจ๋ ๋ฉ์๋๋ฅผ ์ฌ์ ์ ํด์ผํจ
class Test1 implements Demo1 {
@Override
public void disp() {
System.out.println("disp()...");
}
@Override
public void print() {
System.out.println("print()...");
}
public void sub() {
System.out.println("sub()...");
}
}

package ch08.unit06;
public class Ex02 {
public static void main(String[] args) {
DemoImp12 d1 = new DemoImp12();
d1.disp();
d1.print();
d1.sub();
System.out.println();
//์
์บ์คํ
Ademo2 d2 = new DemoImp12();
Bdemo2 d3 = new DemoImp12();
d2.disp();
//d2.print(); ์ปด์ค๋ฅ
d3.print();
((Ademo2)d3).disp(); // Ademo2, Bdemo2 ๊ฐ ๊ตฌํ๋์์ผ๋ฏ๋ก ๊ฐ๋ฅ
((DemoImp12)d3).sub(); // ๋ค์ด ์บ์คํ
}
}
interface Ademo2 {
public void disp() ;
}
interface Bdemo2 {
public void print ();
}
//2๊ฐ ์ด์์ ์ธํฐํ์ด์ค ๊ตฌํ
class DemoImp12 implements Ademo2, Bdemo2 {
@Override
public void print() {
System.out.println("print()....");
}
@Override
public void disp() {
System.out.println("disp()....");
}
public void sub() {
System.out.println("sub()....");
}
}

package ch08.unit06;
public class Ex03 {
public static void main(String[] args) {
Demo3 d = new Test3();
d.print();
}
}
interface Demo3{
public void print();
public void disp();
}
//์ถ์ ํด๋์ค๋ ์ธํฐํ์ด์ค์ ๋ชจ๋ ๋ฉ์๋๋ฅผ ๊ตฌํํ์ง ์์๋๋จ
abstract class DemoImp13 implements Demo3{
@Override
public void disp() {
System.out.println("disp()...");
}
}
class Test3 extends DemoImp13{
public void print() {
System.out.println("disp()...");
}
}

package ch08.unit06;
public class Ex04 {
public static void main(String[] args) {
Cdemo4 d= new DemoImp4();
d.print();
}
}
interface Ademo4{
public void print();
}
interface Bdemo4{
public void disp();
}
//์ธํฐํ์ด์ค๋ ๋ค์ค ์์ ๊ฐ๋ฅ
interface Cdemo4 extends Ademo4, Bdemo4{
public void sub();
}
class DemoImp4 implements Cdemo4{
@Override
public void print() {
System.out.println("print...");
}
@Override
public void disp() {
System.out.println("disp...");
}
@Override
public void sub() {
System.out.println("sub...");
}
}

package ch08.unit06;
public class Ex05 {
public static void main(String[] args) {
Store st = new Store();
Fruit f = new Orange();
st.sell(f);
st.sell(new Apple());
}
}
/*
- ์ธํฐํ์ด์ค ํน์ง
: ํด๋์ค๊ฐ์ ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถ ์ ์๋ค.
: ํ์คํ๊ฐ ๊ฐ๋ฅํ๋ค.
: ๊ฐ๋ฐ ์๊ฐ์ ๋จ์ถํ ์ ์๋ค.
*/
interface Fruit {
public int gerPrice();
public String getName();
}
class Apple implements Fruit{
@Override
public int gerPrice() {
return 1500;
}
@Override
public String getName() {
return "์ฌ๊ณผ";
}
}
class Orange implements Fruit{
@Override
public int gerPrice() {
return 1000;
}
@Override
public String getName() {
return "์ค๋ ์ง";
}
}
class Store {
public void sell(Fruit f) {
System.out.println(f.getName()+":"+f.gerPrice());
}
}

๋ํดํธ ๋ฉ์๋
- ์๋ฐ 8๋ถํฐ ์ฌ์ฉ ๊ฐ๋ฅ
- ๋ํดํธ ๋ฉ์๋๋ ์ธํฐํ์ด์ค์ ์ ์ธ๋์ง๋ง, ์ ์๊ฐ ๋ ๋ฉ์๋๋ก ๊ตฌํํด๋์ค์์ ์ฌ์ ์๊ฐ ๊ฐ๋ฅ
- ๋ํดํธ ๋ฉ์๋๋ public๋ฅผ ์๋ตํด๋ public ํน์ฑ์ ๊ฐ๋๋ค.
- ๋ํดํธ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ๋ฐ๋์ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ํด๋์ค์ ๊ฐ์ฒด๋ฅผ ์์ฑํ ํ์๋ง ์ฌ์ฉ ๊ฐ๋ฅ
- ์ธํฐํ์ด์ค๋ฅผ ์์ ๋ฐ์ ์ธํฐํ์ด์ค๋ ๋ํดํธ ๋ฉ์๋๋ฅผ ์ฌ์ ์ํ๊ฑฐ๋ ๋ค์ ์ถ์ ๋ฉ์๋๋ก ์ ์ธ ํ ์ ์๋ค.

package ch08.unit06;
public class Ex06 {
public static void main(String[] args) {
int s = Demo6.sum(10);
System.out.println(s);
Demo6 d = new DemoImp16();
int x = d.max(10, 5);
d.write(x);
}
}
interface Demo6 {
public void write(int n);
public static int sum(int n) {
int s = 0;
for (int i = 1; i <= n; i++) {
s += i;
}
return s;
}
// default ํค์๋๋ก ๋ฉ์๋ ๊ตฌํ, JDk 8๋ถํฐ ๊ฐ๋ฅ
// ๊ตฌํ ํด๋์ค์์ ์ฌ์ ์ ๊ธฐ๋ฅ
public default int max(int m, int n) {
return m > n ? m : n;
}
}
class DemoImp16 implements Demo6 {
@Override
public void write(int n) {
System.out.println("๊ฒฐ๊ณผ :"+n);
}
}

์ ์ (static)๋ฉ์๋
- ์๋ฐ 8๋ถํฐ ์ฌ์ฉ ๊ฐ๋ฅ
- ๋ํดํธ ๋ฉ์๋์ ๋ฌ๋ฆฌ ๊ฐ์ฒด๊ฐ ์์ด๋ ์ธํฐํ์ด์ค๋ง์ผ๋ก ํธ์ถ์ด ๊ฐ๋ฅ
- static ๋ฉ์๋๋ public๋ฅผ ์๋ตํด๋ public ํน์ฑ์ ๊ฐ๋๋ค.

private ๋ฉ์๋
- ์๋ฐ 9๋ถํฐ private ๋ฉ์๋๋ฅผ ์ ์ ํ ์ ์๋ค.

์ธํฐํ์ด์ค(interface)์ ์์
- ์ธํฐํ์ด์ค๋ ๋ค๋ฅธ ์ธํฐํ์ด์ค๋ฅผ ์์ ๋ฐ์ ์ ์์ผ๋ฉฐ, extends ํค์๋๋ฅผ ์ฌ์ฉ ํ๋ค.
- ์ธํฐํ์ด์ค๋ ๋ค์ค ์์์ ์ง์

ํด๋์ค์์ ์ธํฐํ์ด์ค ๊ตฌํ
- ์ธํฐํ์ด์ค๋ ํด๋์ค๋ฅผ ์ํ ํ ํ๋ฆฟ์ด๊ธฐ ๋๋ฌธ์ class ์์ implements ํค์๋๋ฅผ ์ด์ฉํ์ฌ ๊ตฌํํด์ผ ํ๋ค.
- ํด๋์ค๋ ๋์์ 2๊ฐ ์ด์์ ์ธํฐํ์ด์ค๋ฅผ implements ํ ์ ์๋ค.
- ์ธํฐํ์ด์ค๋ฅผ implementsํ ํด๋์ค๋ ์ธํฐํ์ด์ค์ ์์ ์ธํฐํ์ด์ค๊ฐ ์ ๊ณตํ๋ ์ถ์ ๋ฉ์๋๋ฅผ ํฌํจํด ๋ชจ๋ ๋ฉ์๋๋ฅผ ๊ตฌํ(override)ํด์ผ ํ๋ฉฐ ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ ํด๋น ํด๋์ค๋ฅผ ์ถ์(abstract) ํด๋์ค๋ก ์ ์ธํด์ผ ํ๋ค.

์ต๋ช ๊ตฌํ ๊ฐ์ฒด
- ๊ตฌํ ํด๋์ค์ ์์ฑ์ ์๋ตํ๊ณ new ์์์ด ์๋ ๊ณณ์์ ๋ฐ๋ก ๊ตฌํ ๊ฐ์ฒด๋ฅผ ์์ฑํ ์ ์๋ค.

์ธํฐํ์ด์ค ์ฐธ์กฐํ์ ํ ๋ณํ
- ์ธํฐํ์ด์ค๋ ์์ํด๋์ค์ ๋ง์ฐฌ๊ฐ์ง๋ก ํ ๋ณํ ์์ด ๋ฐ๋ก ๊ตฌํํด๋์ค๋ฅผ ์ฐธ์กฐ ํ ์ ์๋ค.
- ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ์ง ์์ ํด๋์ค์๋ ํ๋ณํ์ด ๋์ง ์๋๋ค.
- ๊ตฌํ ํด๋์ค๋ฅผ ์ธํฐํ์ด์ค๋ก ํ ๋ณํ ํ ๋ค์ ๊ตฌํ ํด๋์ค๋ก ํ ๋ณํ์ ๋ฐ๋์ ๊ฐ์ ์บ์คํ ์ ํด์ผ ํ๋ค.
- โถ์ ์บ์คํ ์ธํฐํ์ด์ค ๊ฐ์ฒด๋ช = ๊ตฌํํด๋์ค๊ฐ์ฒด;
- โถ๋ค์ด ์บ์คํ : ๊ตฌํํด๋์ค ๊ฐ์ฒด๋ช = (๊ตฌํํด๋์ค) ์ธํฐํ์ด์ค ๊ฐ์ฒด;
package ch08.unit06;
public class Ex07 {
public static void main(String[] args) {
// ์ธํฐํ์ด์ค ์ต๋ช
๊ตฌํ
Demo7 obj = new Demo7() {
@Override
public void disp() {
System.out.println("disp...");
}
};
obj.disp();
}
}
interface Demo7{
public void disp();
}

'๐ป > JAVA' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [Java] 14์ผ์ฐจ : ์์ธ(Exception)์ฒ๋ฆฌ (3) | 2024.03.05 |
|---|---|
| [Java] 14์ผ์ฐจ : ์ค์ฒฉํด๋์ค, ์ด๊ฑฐํ, ์ด๋ ธํ ์ด์ , ๋ ์ฝ๋ (0) | 2024.03.05 |
| [Java] 13์ผ์ฐจ : ์์ 2 (0) | 2024.03.04 |
| [Java] 13์ผ์ฐจ : ์์ (0) | 2024.03.04 |
| [Java] 12์ผ์ฐจ : ์๋ฐ์ ๊ธฐ๋ณธ API ํด๋์ค 6 (0) | 2024.03.02 |