1~2. μμ (Inheritance)
κ°λ
κΈ°μ‘΄μ ν΄λμ€λ‘ μλ‘μ΄ ν΄λμ€λ₯Ό μμ±νλ κ². (μ½λμ μ¬μ¬μ©)
λ ν΄λμ€λ₯Ό λΆλͺ¨μ μμμΌλ‘ κ΄κ³λ₯Ό λ§Ίμ΄μ£Όλ κ².
class μμν΄λμ€ extends λΆλͺ¨ν΄λμ€ {
// ...
}
class Parent { }
class Child extends Parent {
// ...
}
νΉμ§
μμμ μ‘°μμ λͺ¨λ λ©€λ²λ₯Ό μμλ°λλ€. (μμ±μ, μ΄κΈ°νλΈλ μ μΈ)
μμμ λ©€λ² κ°μλ μ‘°μλ³΄λ€ μ μ μ μλ€. (κ°κ±°λ λ§λ€.)
class Parent {
int age;
}
class Child extends Parent { }
μμμ λ³κ²½μ μ‘°μμ μν₯μ λ―ΈμΉμ§ μλλ€.
class Parent {
int age;
}
class Child extends Parent {
void play () {
System.out. println ( "λμ~" );
}
}
3~4. ν΄λμ€ κ°μ κ΄κ³, μμκ³Ό ν¬ν¨
ν¬ν¨(composite)μ΄λ?
ν΄λμ€μ λ©€λ²λ‘ μ°Έμ‘°λ³μλ₯Ό μ μΈνλ κ²
μμ λ¨μμ ν΄λμ€λ₯Ό λ§λ€κ³ , μ΄ λ€μ μ‘°ν©ν΄μ ν΄λμ€λ₯Ό λ§λ λ€.
class Circle {
int x;
int y;
int r;
}
class Point {
int x;
int y;
}
class Circle {
Point c = new Point ();
int r;
}
class Car {
Engine e = new Engine ();
Door [] d = new Door [ 4 ];
}
ν΄λμ€ κ°μ κ΄κ³ κ²°μ νκΈ°
μμκ΄κ³
β~μ ~μ΄λ€.β
ν¬ν¨κ΄κ³
β~μ ~μ κ°μ§κ³ μλ€.β
μμ μ μ κ°μ§κ³ μλ€. (λ μμ°μ€λ½κΈ° λλ¬Έμ ν¬ν¨κ΄κ³κ° μ ν©)
5~6. λ¨μΌ μμ, Object ν΄λμ€
λ¨μΌ μμ (Single Inheritance)
class TvDVD extends Tv , DVD { // μλ¬. μ‘°μμ νλλ§ νμ©λλ€.
// ...
// Tv.power() μ DVD.power() κ° μ‘΄μ¬νμ λ μΆ©λ μ°λ €
}
Javaλ λ¨μΌμμλ§μ νμ©νλ€. (C++μ λ€μ€μμ νμ©)
class TvDVD extends Tv {
DVD dvd = new DVD ();
void play () {
dvd. play ();
}
void stop () {
dvd. stop ();
}
void rew () {
dvd. rew ();
}
void ff () {
dvd. ff ();
}
}
λΉμ€μ΄ λμ ν΄λμ€ νλλ§ μμκ΄κ³λ‘, λλ¨Έμ§λ ν¬ν¨κ΄κ³λ‘ νλ€.
Object ν΄λμ€ - λͺ¨λ ν΄λμ€μ μ‘°μ
class Tv {
// ...
}
class SmartTv extends Tv {
// ...
}
// μ»΄νμΌλ¬ μλ μΆκ°
class Tv extends Object {
// ...
}
class SmartTv extends Tv {
// ...
}
λΆλͺ¨κ° μλ ν΄λμ€λ μλμ μΌλ‘ Object ν΄λμ€λ₯Ό μμλ°κ² λλ€.
λͺ¨λ ν΄λμ€λ Object ν΄λμ€μ μ μλ 11κ°μ λ©μλλ₯Ό μμλ°λλ€.
toString()
equals(Object obj)
hashcode()
...
7~9. μ€λ²λΌμ΄λ©
μ€λ²λΌμ΄λ© (overriding)
class Point {
int x;
int y;
String getLocation () {
return "x :" + x + ", y:" + y;
}
}
class Point3D extends Point {
int z;
// μ€λ²λΌμ΄λ©
String getLocation () {
return "x :" + x + ", y:" + y + ", z:" + z;
}
}
μμλ°μ μ‘°μμ λ©μλλ₯Ό μμ μ λ§κ² λ³κ²½νλ κ²
μ€λ²λΌμ΄λ©μ 쑰건
μ μΈλΆ(λ°ννμ
, λ©μλ μ΄λ¦, 맀κ°λ³μ λͺ©λ‘)κ° μ‘°μ ν΄λμ€μ λ©μλμ μΌμΉν΄μΌ νλ€.
μ κ·Ό μ μ΄μλ₯Ό μ‘°μ ν΄λμ€μ λ©μλλ³΄λ€ μ’μ λ²μλ‘ λ³κ²½ν μ μλ€.
μμΈλ μ‘°μ ν΄λμ€μ λ©μλλ³΄λ€ λ§μ΄ μ μΈν μ μλ€.
μ? μ‘°μμ΄ λͺ¨λ μμμ μμΈλ₯Ό κ°λΉνκΈ° λλ¬Έμ
μ€λ²λ‘λ© vs μ€λ²λΌμ΄λ©
class Parent {
void parentMethod () {}
}
class Child extends Parent {
void parentMethod () {} // μ€λ²λΌμ΄λ©
void parentMethod ( int i ) {} // μ€λ²λ‘λ©
void childMethod () {} // λ©μλ μ μ
void childMethod ( int i ) {} // μ€λ²λ‘λ©
void childMethod () {} // μλ¬. μ€λ³΅μ μ
}
μ€λ²λ‘λ©(overloading)
κΈ°μ‘΄μ μλ μ΄λ¦μ΄ κ°μ μλ‘μ΄ λ©μλλ₯Ό μ μνλ κ²(new)
μ€λ²λΌμ΄λ©(overriding)
μμλ°μ λ©μλμ λ΄μ©μ λ³κ²½νλ κ²(change, modify)
10~11. μ°Έμ‘°λ³μ super, μμ±μ super()
μ°Έμ‘°λ³μ super
κ°μ²΄ μμ μ κ°λ¦¬ν€λ μ°Έμ‘°λ³μ. μΈμ€ν΄μ€ λ©μλ(μμ±μ)λ΄μλ§ μ‘΄μ¬
μ‘°μμ λ©€λ²λ₯Ό μμ μ λ©€λ²μ ꡬλ³ν λ μ¬μ©
λ°λ‘ μμ μ‘°μμ μλ―Έ
Parent β Child β GrandChild μΌ λ
GrandChild μ super λ Child
public class Ex7_2 {
public static void main ( String [] args ) {
Child c = new Child ();
c. method ();
}
}
class Parent {
int x = 10 ; // super.x
}
class Child extends Parent {
int x = 20 ; // this.x
void method () {
System.out. println ( "x=" + x);
System.out. println ( "this.x=" + this .x);
System.out. println ( "super.x=" + super .x);
}
}
public class Ex7_3 {
public static void main ( String [] args ) {
Child2 c = new Child2 ();
c. method ();
}
}
class Parent2 {
int x = 10 ; // super.x λ©΄μ this.x
}
class Child2 extends Parent2 {
void method () {
System.out. println ( "x=" + x);
System.out. println ( "this.x=" + this .x);
System.out. println ( "super.x=" + super .x);
}
}
super() - μ‘°μμ μμ±μ
μ‘°μμ μμ±μλ₯Ό νΈμΆν λ μ¬μ©
μ‘°μμ λ©€λ²λ μ‘°μμ μμ±μλ₯Ό νΈμΆν΄μ μ΄κΈ°ν
class Point {
int x, y;
Point ( int x , int y ) {
this .x = x;
this .y = y;
}
}
class Point3D extends Point {
int z;
// λΆμ μ ν μ΄κΈ°ν
Point3D ( int x , int y , int z ) {
this .x = x; // μ‘°μμ λ©€λ²λ₯Ό μ΄κΈ°ν
this .y = y; // μ‘°μμ λ©€λ²λ₯Ό μ΄κΈ°ν
this .z = z;
}
// μ¬λ°λ₯Έ μ΄κΈ°ν
Point3D ( int x , int y , int z ) {
super (x, y); // μ‘°μν΄λμ€μ μμ±μ Point(int x, int y)λ₯Ό νΈμΆ
this .z = z; // μμ μ λ©€λ²λ₯Ό μ΄κΈ°ν
}
}
μμ±μμ 첫 μ€μ λ°λμ μμ±μλ₯Ό νΈμΆν΄μΌ νλ€.
κ·Έλ μ§ μμΌλ©΄ μ»΄νμΌλ¬κ° μμ±μμ 첫 μ€μ super();
λ₯Ό μ½μ
12~14. ν¨ν€μ§, ν΄λμ€ ν¨μ€
ν¨ν€μ§ (package)
μλ‘ κ΄λ ¨λ ν΄λμ€μ 묡μ
ν΄λμ€λ ν΄λμ€ νμΌ(*.class), ν¨ν€μ§λ ν΄λ, νμ ν¨ν€μ§λ νμ ν΄λ
ν΄λμ€μ μ€μ μ΄λ¦(full name)μ ν¨ν€μ§λ₯Ό ν¬ν¨. (java.lang.String)
ν¨ν€μ§μ μ μΈ
ν¨ν€μ§λ μμ€νμΌμ 첫 λ²μ§Έ λ¬Έμ₯μΌλ‘ λ¨ νλ² μ μΈ
κ°μ μμ€ νμΌμ ν΄λμ€λ€μ λͺ¨λ κ°μ ν¨ν€μ§μ μνκ² λλ€.
ν¨ν€μ§ μ μΈμ΄ μμΌλ©΄ μ΄λ¦μλ(unnamed) ν¨ν€μ§μ μνκ² λλ€.
ν΄λμ€ ν¨μ€ (class path)
ν΄λμ€ νμΌ(*.class)
μ μμΉλ₯Ό μλ €μ£Όλ κ²½λ‘(path)
νκ²½λ³μ classpathλ‘ κ΄λ¦¬νλ©°, κ²½λ‘κ°μ ꡬλΆμλ β;βλ₯Ό μ¬μ©
classpath(νκ²½λ³μ)μ ν¨ν€μ§μ 루νΈλ₯Ό λ±λ‘ν΄μ€μΌ ν¨.
15~16. import문, static import문
import문
class ImportTest {
java.util.Date today = new java.util. Date ();
}
import java.util.Date;
class ImportTest {
Date today = new Date ();
}
ν΄λμ€λ₯Ό μ¬μ©ν λ ν¨ν€μ§ μ΄λ¦μ μλ΅ν μ μλ€.
μ»΄νμΌλ¬μκ² ν΄λμ€κ° μν ν¨ν€μ§λ₯Ό μλ €μ€λ€.
java.langν¨ν€μ§μ ν΄λμ€λ importνμ§ μκ³ λ μ¬μ©ν μ μλ€.
String, Object, System, Thread, β¦
importλ¬Έμ μ μΈ
import ν¨ν€μ§λͺ
.ν΄λμ€λͺ
;
λλ
import ν¨ν€μ§λͺ
. * ;
importλ¬Έμ μ μΈνλ λ°©λ²μ λ€μκ³Ό κ°λ€.
import java.util. * ;
import java.text. * ;
// javaν¨ν€μ§μ λͺ¨λ ν΄λμ€ (ν¨ν€μ§ μ μΈ)
import java. * ;
importλ¬Έμ ν¨ν€μ§λ¬Έκ³Ό ν΄λμ€ μ μΈμ μ¬μ΄μ μ μΈνλ€.
importλ¬Έμ μ»΄νμΌ μμ μ²λ¦¬λλ―λ‘ νλ‘κ·Έλ¨μ μ±λ₯μ μν₯μμ.
μλμ λ μ½λλ μλ‘ μλ―Έκ° λ€λ₯΄λ€.
import java.sql. * ; // java.sql.Date
import java.util. * ; // java.util.Date
public class ImportTest {
public static void main ( String [] args ) {
java.util.Date today = new java.util. Date ();
}
}
μ΄λ¦μ΄ κ°μ ν΄λμ€κ° μν λ ν¨ν€μ§λ₯Ό importν λλ ν΄λμ€ μμ ν¨ν€μ§λͺ
μ λΆμ¬μ€μΌ νλ€.
static import문
import static java.lang.Integer. * ; // Integerν΄λμ€μ λͺ¨λ staticλ©μλ
import static java.lang.Math.random; // Math.random()λ§
import static java.lang.System.out; // System.outμ outλ§μΌλ‘ μ°Έμ‘°κ°λ₯
staticλ©€λ²λ₯Ό μ¬μ©ν λ ν΄λμ€ μ΄λ¦μ μλ΅ν μ μκ² ν΄μ€λ€.
17~20. μ μ΄μ, static, final, abstract
μ μ΄μ(modifier)
public class ModifierTest {
public static final int WIDTH = 200 ;
public static void main ( String [] args ) {
System.out. println ( "WIDTH=" + WIDTH);
}
}
ν΄λμ€μ ν΄λμ€μ λ©€λ²(λ©€λ² λ³μ, λ©μλ)μ λΆκ°μ μΈ μλ―Έ λΆμ¬
μ κ·Ό μ μ΄μ - public
protected
(default)
private
κ·Έ μΈ - static
final
abstract
native
transient
synchronized
volatile
strictfp
νλμ λμμ μ¬λ¬ μ μ΄μλ₯Ό κ°μ΄ μ¬μ©κ°λ₯(μ κ·Ό μ μ΄μλ νλλ§)
static - ν΄λμ€μ, 곡ν΅μ μΈ
λμ μλ―Έ λ©€λ²λ³μ λͺ¨λ μΈμ€ν΄μ€μ 곡ν΅μ μΌλ‘ μ¬μ©λλ ν΄λμ€ λ³μκ° λλ€. ν΄λμ€ λ³μλ μΈμ€ν΄μ€λ₯Ό μμ±νμ§ μκ³ λ μ¬μ© κ°λ₯νλ€. ν΄λμ€κ° λ©λͺ¨λ¦¬μ λ‘λλ λ μμ±λλ€. λ©μλ μΈμ€ν΄μ€λ₯Ό μμ±νμ§ μκ³ λ νΈμΆμ΄ κ°λ₯ν static λ©μλκ° λλ€. static λ©μλ λ΄μμλ μΈμ€ν΄μ€ λ©€λ²λ€μ μ§μ μ¬μ©ν μ μλ€.
final - λ§μ§λ§μ, λ³κ²½λ μ μλ
λμ μλ―Έ ν΄λμ€ λ³κ²½λ μ μλ ν΄λμ€, νμ₯λ μ μλ ν΄λμ€κ° λλ€. κ·Έλμ finalλ‘ μ§μ λ ν΄λμ€λ λ€λ₯Έ ν΄λμ€μ μ‘°μμ΄ λ μ μλ€. λ©μλ λ³κ²½λ μ μλ λ©μλ, finalλ‘ μ§μ λ λ©μλλ μ€λ²λΌμ΄λ©μ ν΅ν΄ μ¬μ μ λ μ μλ€. λ©€λ²λ³μ μ§μλ³μ λ³μ μμ final μ΄ λΆμΌλ©΄, κ°μ λ³κ²½ν μ μλ μμκ° λλ€.
final class AbstractTest { // μ‘°μμ΄ λ μ μλ ν΄λμ€
final int MAX_SIZE = 10 ; // κ°μ λ³κ²½ν μ μλ λ©€λ²λ³μ (μμ)
final void getMaxSize () { // μ€λ²λΌμ΄λ©μ ν μ μλ λ©μλ (λ³κ²½λΆκ°)
final int LV = MAX_SIZE; // κ°μ λ³κ²½ν μ μλ μ§μλ³μ (μμ)
return MAX_SIZE;
}
}
abstract - μΆμμ, λ―Έμμ±μ
λμ μλ―Έ ν΄λμ€ ν΄λμ€ λ΄μ μΆμ λ©μλκ° μ μΈλμ΄ μμμ μλ―Ένλ€. λ©μλ μ μΈλΆλ§ μμ±νκ³ κ΅¬νλΆλ μμ±νμ§ μμ μΆμ λ©μλμμ μλ¦°λ€.
abstract class AbstractTest { // μΆμ ν΄λμ€ (μΆμ λ©μλλ₯Ό ν¬ν¨ν ν΄λμ€)
abstract void move (); // μΆμ λ©μλ (ꡬνλΆκ° μλ λ©μλ)
}
AbstractTest a = new AbstractTest (); // μλ¬. μΆμ ν΄λμ€μ μΈμ€ν΄μ€ μμ±λΆκ°
21. μ κ·Ό μ μ΄μ
private
- κ°μ ν΄λμ€ λ΄μμλ§ μ κ·Ό κ°λ₯
(default)
- κ°μ ν¨ν€μ§ λ΄μμλ§ μ κ·Ό κ°λ₯
protected
- κ°μ ν¨μ§ν€ λ΄μμ, κ·Έλ¦¬κ³ λ€λ₯Έ ν¨ν€μ§μ μμν΄λμ€μμ μ κ·Ό κ°λ₯
public
- μ κ·Ό μ νμ΄ μμ
μ μ΄μ κ°μ ν΄λμ€ κ°μ ν¨ν€μ§ μμ ν΄λμ€ μ 체 public
β β β β protected
β β β (default)
β β private
β
22. μΊ‘μν
μΊ‘μνμ μ κ·Ό μ μ΄μ
public class Time {
// μΈλΆμμ μ§μ μ κ·Όνμ§ λͺ»νλλ‘ private
private int hour;
private int minute;
private int second;
// λ©μλλ₯Ό ν΅ν΄ κ°μ μ κ·Ό νμ©
public int getHour () {
return hour;
}
public void setHour ( int hour ) {
if (hour < 0 || hour > 23 ) {
return ;
}
this .hour = hour;
}
}
μ κ·Ό μ μ΄μλ₯Ό μ¬μ©νλ μ΄μ
μΈλΆλ‘λΆν° λ°μ΄ν°λ₯Ό 보νΈνκΈ° μν΄μ
μΈλΆμλ λΆνμν, λ΄λΆμ μΌλ‘λ§ μ¬μ©λλ, λΆλΆμ κ°μΆκΈ° μν΄μ
23. λ€νμ± (polymorphism)
κ°λ
μ‘°μ νμ
μ°Έμ‘° λ³μλ‘ μμ νμ
κ°μ²΄λ₯Ό λ€λ£¨λ κ²
Tv t = new SmartTv (); // νμ
λΆμΌμΉ
class Tv {
boolean power;
int channel;
void power () {
power = ! power;
}
void channelUp () {
++ channel;
}
void channelDown () {
-- channel;
}
}
class SmartTv extends Tv {
boolean caption;
void displayCaption (String text ) {
if (caption) {
System.out. println (text);
}
}
}
νΉμ§
SmartTv s = new SmartTv (); // μ°Έμ‘°λ³μμ μΈμ€ν΄μ€μ νμ
μ΄ μΌμΉ
Tv t = new SmartTv (); // μ‘°μνμ
μ°Έμ‘°λ³μλ‘ μμνμ
μΈμ€ν΄μ€ μ°Έμ‘°
// μ‘°μνμ
Tvμ°Έμ‘°λ³μλ‘ μμνμ
SmartTvμΈμ€ν΄μ€λ₯Ό μ°Έμ‘°ν κ²½μ° μ‘°μμ λ©€λ²λ§ μ¬μ©ν μ μμ
κ°μ²΄μ μ°Έμ‘°λ³μμ νμ
μ΄ μΌμΉν λμ μΌμΉνμ§ μμ λμ μ°¨μ΄?
Tv t = new SmartTv (); // OK.
SmartTv s = new Tv (); // μλ¬.
μμ νμ
μ μ°Έμ‘°λ³μλ‘ μ‘°μ νμ
μ κ°μ²΄λ₯Ό κ°λ¦¬ν¬ μ μλ€.
μ₯μ
λ€νμ 맀κ°λ³μ - λ©μλ νΈμΆ μ, μμ κ³Ό κ°μ νμ
λλ μμ νμ
μ μΈμ€ν΄μ€λ₯Ό λκΈΈ μ μμ
νλμ λ°°μ΄μ μ¬λ¬ μ’
λ₯μ κ°μ²΄λ₯Ό μ μ₯νμ¬ λ€λ£° μ μμ
24~25. μ°Έμ‘°λ³μμ νλ³ν
μ°Έμ‘°λ³μμ νλ³ν μ λ³νλ κ²
λ¬λΌμ§λ κ² : κ°μ²΄μ νμ
κ·Έλλ‘μΈ κ² : κ°μ²΄ μ체, μ£Όμκ°
μ°Έμ‘°λ³μμ νλ³νμ νλ μ΄μ
μ¬μ©ν μ μλ λ©€λ²μ κ°―μλ₯Ό μ‘°μ νκΈ° μν΄μ
μ‘°μ μμ κ΄κ³μ μ°Έμ‘°λ³μλ μλ‘ νλ³ν κ°λ₯
class Car { }
class FireEngine extends Car { }
class Ambulance extends Car { }
FireEngine f = new FireEngine ();
Car c = (Car)f; // OK. μ‘°μμΈ Carνμ
μΌλ‘ νλ³ν (μ
μΊμ€ν
)
FireEngine f2 = FireEngine (c); // OK. μμμΈ FireEngineνμ
μΌλ‘ νλ³ν (λ€μ΄μΊμ€ν
)
Ambulance a = (Ambulance)f; // μλ¬. μμκ΄κ³κ° μλ ν΄λμ€ κ°μ νλ³ν λΆκ°
νλ³ν μ μ€μ μΈμ€ν΄μ€κ° 무μμΈμ§κ° μ€μ
public class Ex7_7 {
public static void main ( String [] args ) {
Car car = null ;
FireEngine fe = new FireEngine ();
FireEngine fe2 = (FireEngine)car; // λ€μ΄μΊμ€ν
Car car2 = (Car)fe2; // μ
μΊμ€ν
car2. drive (); // NullPointerException λ°μ.
// μ? κΈ°μ‘΄ μΈμ€ν΄μ€μΈ carμ΄ nullμ΄κΈ° λλ¬Έμ
Car c = new Car ();
FireEngine f = (FireEngine)c; // νλ³ν μ€ν μλ¬ ClassCastException λ°μ.
f. water (); // μ»΄νμΌμ OK.
// μ€μ κ°μ²΄λ CarμΈμ€ν΄μ€μ΄κΈ° λλ¬Έμ f.water() μ¬μ©λΆκ°
}
}
26. instanceof μ°μ°μ
μ°Έμ‘°λ³μμ νλ³ν κ°λ₯ μ¬λΆ νμΈμ μ¬μ©. κ°λ₯νλ©΄ true
λ°ν
νλ³ν μ μ λ°λμ instanceof
λ‘ νμΈν΄μΌ ν¨
void doWork (Car c) {
if (c instanceof FireEngine) { // 1. νλ³νμ΄ κ°λ₯νμ§ νμΈ
FireEngine fe = (FireEngine)c; // 2. νλ³ν
fe. water ();
}
}
FireEngine fe = new FireEngine ();
System.out. println (fe instanceof Object); // true
System.out. println (fe instanceof Car); // true
System.out. println (fe instanceof FireEngine); // true
Object obj = (Object)fe; // OK.
Car c = (Car)fe; // OK.
27~28. 맀κ°λ³μμ λ€νμ±
class Product {
int price;
int bonusPoint;
}
class Tv extends Product { }
class Computer extends Product { }
class Audio extends Product { }
class Buyer {
int money = 1000 ;
int bonusPoint = 0 ;
}
// Productμ μμ νμ
μΈ Tv, Computer, Audio λͺ¨λ 맀κ°λ³μλ‘ λ°μ μ μμ
void buy (Product p) {
money -= p.price;
bonusPoint += p.bonusPoint;
}
Buyer b = new Buyer ();
Tv tv = new Tv ();
Computer com = new Computer ();
b. buy (tv);
b. buy (com);
μ°Έμ‘°ν 맀κ°λ³μλ λ©μλ νΈμΆ μ, μμ κ³Ό κ°μ νμ
λλ μμ νμ
μ μΈμ€ν΄μ€λ₯Ό λκΈΈ μ μμ
27~28. μ¬λ¬ μ’
λ₯μ κ°μ²΄λ₯Ό λ°°μ΄λ‘ λ€λ£¨κΈ°
Product p[] = new Product [ 3 ];
p[ 0 ] = new Tv ();
p[ 1 ] = new Computer ();
p[ 2 ] = new Audio ();
class Buyer {
int money = 1000 ;
int bonusPoint = 0 ;
Product [] cart = new Product [ 10 ];
int i = 0 ;
void buy (Product p ) {
if (money < p.price) {
System.out. println ( "μμ‘λΆμ‘±" );
return ;
}
money -= p.price;
bonusPoint += p.bonusPoint;
cart[i ++ ] = p;
}
}
μ‘°μνμ
μ λ°°μ΄μ μμλ€μ κ°μ²΄λ₯Ό λ΄μ μ μμ
31~32. μΆμ ν΄λμ€, μΆμ λ©μλ
μΆμ ν΄λμ€ (abstract class)
abstract class Player { // μΆμ ν΄λμ€ (λ―Έμμ± ν΄λμ€)
abstract void play ( int pos ); // μΆμ λ©μλ (λͺΈν΅{}μ΄ μλ λ―Έμμ± λ©μλ)
abstract void stop (); // μΆμ λ©μλ
}
κ°λ
λ―Έμμ± μ€κ³λ. λ―Έμμ± λ©μλλ₯Ό κ°κ³ μλ ν΄λμ€
public abstract class AbstractClass {
private final String name;
public AbstractClass ( final String name ) {
this .name = name;
}
abstract void method ();
public String getName () {
return name;
}
}
Abstract Class, μΆμ ν΄λμ€λ νλ μ΄μμ abstract
λ©μλλ₯Ό μ μΈν ν΄λμ€λ‘μ¨ μ΄λ₯Ό μμνλ μμ ν΄λμ€μμ μμ±νλλ‘ μ λνλ ν΄λμ€λ€.
μΌλ° ν΄λμ€μ abstract
λ©μλλ₯Ό μΆκ°νκΈ° λλ¬Έμ μΈμ€ν΄μ€νκ° λΆκ°νκ³ λ―Έμμ± μ€κ³λλΌκ³ λ λΆλ¦°λ€.
λ¨μΌ μμλ§ κ°λ₯νλ€.
μΆμ ν΄λμ€λ₯Ό μμνλ μ§ν©κ°μλ μ°κ΄ κ΄κ³κ° μλ€.
Player p = new Player (); // μλ¬. μΆμ ν΄λμ€μ μΈμ€ν΄μ€ μμ± λΆκ°
λ€λ₯Έ ν΄λμ€ μμ±μ λμμ μ£ΌκΈ° μν κ². μΈμ€ν΄μ€ μμ± λΆκ°.
class AudioPlayer extends Player {
void play ( int pos ) {
// μΆμ λ©μλλ₯Ό ꡬν
}
void stop () {
// μΆμ λ©μλλ₯Ό ꡬν
}
}
AudioPlayer ap = new AudioPlayer (); // OK.
μμμ ν΅ν΄ μΆμ λ©μλλ₯Ό μμ±ν΄μΌ μΈμ€ν΄μ€ μμ± κ°λ₯
μΆμ λ©μλ (abstract method)
// μ£Όμμ ν΅ν΄ μ΄λ€ κΈ°λ₯μ μνν λͺ©μ μΌλ‘ μμ±νμλμ§ μ€λͺ
abstract 리ν΄νμ
λ©μλμ΄λ¦();
κ°λ
λ―Έμμ± λ©μλ. ꡬνλΆ (λͺΈν΅ { }) κ° μλ λ©μλ
abstract class Player { // μΆμ ν΄λμ€
abstract void play ( int pos ); // μΆμ λ©μλ
abstract void stop (); // μΆμ λ©μλ
}
class AudioPlayer extends Player {
void play ( int pos ) {
// μΆμ λ©μλλ₯Ό ꡬν
}
void stop () {
// μΆμ λ©μλλ₯Ό ꡬν
}
}
// μΆμ λ©μλλ₯Ό 1κ° λ°μ ꡬννμ§ μμκΈ° λλ¬Έμ abstract
abstract class AbstractPlayer extends Player {
void play ( int pos ) {
// μΆμ λ©μλλ₯Ό ꡬν
}
}
κΌ νμνμ§λ§ μμλ§λ€ λ€λ₯΄κ² ꡬνλ κ²μΌλ‘ μμλλ κ²½μ°
abstract class Player { // μΆμ ν΄λμ€
boolean pause;
int currentPos;
Player () { // μΆμ ν΄λμ€λ μμ±μκ° μμ΄μΌ ν¨
pause = false ;
currentPos = 0 ;
}
// μ§μ λ μμΉ(pos)μμ μ¬μνλ κΈ°λ₯μ μμ±ν΄μΌ ν¨
abstract void play ( int pos ); // μΆμ λ©μλ
// μ¬μμ μ¦μ λ©μΆλ κΈ°λ₯μ μμ±ν΄μΌ ν¨
abstract void stop (); // μΆμ λ©μλ
void play () {
play (currentPos); // μΆμ λ©μλ μ¬μ© κ°λ₯
// μ? μ΄μ§νΌ μΆμ ν΄λμ€λ κ°μ²΄ μμ±μ΄ λΆκ°λ₯
// μΈμ€ν΄μ€ λ©μλλ₯Ό νΈμΆ ν μ μλ€λ κ²μ
// μμμ΄ μμ±λ ν΄λμ€λ₯Ό λ§λ€μλ€λ μλ―ΈκΈ° λλ¬Έμ
}
}
μΆμ λ©μλ νΈμΆ κ°λ₯ (νΈμΆ ν λλ μ μΈλΆλ§ νμ)
μΆμ λ©μλλ₯Ό μ μΈν¨μΌλ‘μ¨ μμλ€μκ² μμ΄μ κ°μ νμ κΈ°λ₯μ μμ±νκ² λ κ°μ μ±μ λΆμ¬
33~34. μΆμ ν΄λμ€μ μμ±
μ¬λ¬ ν΄λμ€μ 곡ν΅μ μΌλ‘ μ¬μ©λ μ μλ μΆμ ν΄λμ€λ₯Ό λ°λ‘ μμ±νκ±°λ κΈ°μ‘΄ ν΄λμ€μ κ³΅ν΅ λΆλΆμ λ½μμ μΆμ ν΄λμ€λ₯Ό λ§λ λ€.
abstract class Unit {
int x, y;
abstract void move ( int x , int y );
void stop () { }
}
class Marine extends Unit {
void move ( int x , int y ) { }
void stimPack () { }
}
class Tank extends Unit {
void move ( int x , int y ) { }
void changeMode () { }
}
class Dropship extends Unit {
void move ( int x , int y ) { }
void load () { }
void unload () { }
}
Unit [] group = new Unit [ 3 ];
group[ 0 ] = new Marine ();
group[ 1 ] = new Tank ();
group[ 2 ] = new Dropship ();
for ( int i = 0 ; i < group.length; i ++ ) {
group[i]. move ( 100 , 200 );
}
μΆμν β ꡬ체ν
μΆμνλ μ½λλ ꡬ체νλ μ½λλ³΄λ€ μ μ°νλ€. λ³κ²½μ μ 리
GregorianCalendar cal = new GregorianCalendar (); // ꡬ체μ
Calendar cal = Calendar. getInstance (); // μΆμμ
35~37. μΈν°νμ΄μ€μ μ μΈ, μμ, ꡬν
μΈν°νμ΄μ€
interface PlayingCard {
public static final int SPADE = 4 ;
final int DIAMOND = 3 ; // public static final μλ΅ κ°λ₯
static int HEART = 2 ; // public static final μλ΅ κ°λ₯
int CLOVER = 1 ; // public static final μλ΅ κ°λ₯
public abstract String getCardNumber ();
String getCardKind (); // public abstract μλ΅ κ°λ₯
}
μΆμ λ©μλμ μ§ν© (νλ‘κ·Έλλ° κ΄μ )
ꡬνλ κ²μ΄ μ ν μλ μ€κ³λ. κ»λ°κΈ° (λͺ¨λ λ©€λ²κ° public)
interface Interface {
/* public static final */ String name = "name" ;
/* public abstract */ void method ();
/* public */ static void staticMethod () {
System.out. println ( "do something" );
}
/* public */ default void defaultMethod () {
System.out. println ( "do something" );
}
}
Interface λ μμμ abstract
λ©μλμ μ§ν©μΌλ‘ Abstract Class μ λμΌνκ² μ΄λ₯Ό ꡬννλ ν΄λμ€μμ abstract
λ©μλλ₯Ό μμ±νλλ‘ κ°μ νμ§λ§ Abstract Class λ³΄λ€ μΆμν μ λκ° λλ€.
μΆμ ν΄λμ€κ° λ―Έμμ± μ€κ³λλΌλ©΄ μΈν°νμ΄μ€λ κΈ°λ³Έ μ€κ³λλΌκ³ ν μ μλ€.
λ€μ€ μμμ΄ κ°λ₯νλ€.
μΈν°νμ΄μ€λ₯Ό ꡬννλ μ§ν©κ°μλ κ΄κ³κ° μμ μ μλ€.
JDK1.8 static
λ©μλμ default
λ©μλλ₯Ό μ¬μ©ν μ μκ² λμλ€.
default
λ©μλμ λͺ©μ μ ꡬν체μ 곡ν΅μ μΌλ‘ μ¬μ©λ λ©μλλ₯Ό μΈν°νμ΄μ€μ μ μΈνκΈ° μν¨μ΄λ€.
μΈν°νμ΄μ€μ μμ
μΈν°νμ΄μ€μ μ‘°μμ μΈν°νμ΄μ€λ§ κ°λ₯ (Objectκ° μ΅κ³ μ‘°μμ΄ μλ)
λ€μ€ μμ κ°λ₯ (μΆμ λ©μλλ μΆ©λν΄λ λ¬Έμ μμ. μ? ꡬνλΆκ° μμΌλκΉ)
interface Fightable extends Movalbe , Attackable { }
interface Movable {
void move ( int x , int y );
}
interface Attackable {
void attack (Unit u );
}
μΈν°νμ΄μ€μ ꡬν
μΈν°νμ΄μ€μ μ μλ μΆμ λ©μλλ₯Ό μμ±νλ κ²
class Fighter implements Fightable {
// μΈν°νμ΄μ€μ μ μλ μΆμλ©μλλ₯Ό λͺ¨λ ꡬνν΄μΌ ν¨
public void move ( int x , int y ) {
// λ΄μ© ꡬν
}
public void attack (Unit u ) {
// λ΄μ© ꡬν
}
}
μΌλΆλ§ ꡬννλ κ²½μ°, ν΄λμ€ μμ abstract
λ₯Ό λΆμ¬μΌ ν¨
abstract class Fighter implements Fightable {
public void move ( int x , int y ) {
// λ΄μ© ꡬν
}
μΆμ ν΄λμ€μ μΈν°νμ΄μ€μ μ°¨μ΄μ
μΆμ ν΄λμ€λ μΌλ° ν΄λμ€μ κ°μ§λ§ μΆμ λ©μλλ₯Ό κ°κ³ μμ
μΈν°νμ΄μ€λ μΆμ λ©μλ (static λ©μλ, default λ©μλ, μμ) λ§ κ°κ³ μμ
iv
, μμ±μ, μΈμ€ν΄μ€ λ©μλ λ±μ κ°μ§ μ μμ
38. μΈν°νμ΄μ€μ λ€νμ±
μΈν°νμ΄μ€λ ꡬν ν΄λμ€μ λΆλͺ¨
class Fighter extends Unit implements Fightable {
public void move ( int x , int y ) {
// λ΄μ© ꡬν
}
public void attack (Fightable f ) {
// λ΄μ© ꡬν
}
}
// μ‘°μ ν΄λμ€ -> μμ κ°μ²΄
Unit u = new Fighter ();
// μΈν°νμ΄μ€λ κ°λ₯. νμ§λ§, μΈν°νμ΄μ€μ μ μΈλ κΈ°λ₯λ§ μ¬μ© κ°λ₯
Fightable f = new Fighter ();
f. move ( 100 , 200 );
f. attack ( new Fighter ());
μΈν°νμ΄μ€λ₯Ό λ©μλμ 리ν΄νμ
μΌλ‘ μ§μ ν μ μμ
// Fightable μΈν°νμ΄μ€λ₯Ό ꡬνν ν΄λμ€μ μΈμ€ν΄μ€λ₯Ό λ°ν
Fightable method () {
return new Fighter ();
}
class Fighter extends Unit implements Fightable {
public void move ( int x , int y ) {
// λ΄μ© ꡬν
}
public void attack (Fightable f ) {
// λ΄μ© ꡬν
}
}
39. μΈν°νμ΄μ€μ μ₯μ
λ λμ(κ°μ²΄) κ°μ βμ°κ±Έ, λν, μν΅βμ λλ βμ€κ° μν β
μ μΈ(μ€κ³)μ ꡬνμ λΆλ¦¬ μν¬ μ μμ
// κ»λ°κΈ° + μλ§Ήμ΄
class B {
public void method () {
System.out. println ( "methodInB" );
}
}
// κ»λ°κΈ°
interface I {
public void method ();
}
// μλ§Ήμ΄
class B implements I {
public void method () {
System.out. println ( "methodInB" );
}
}
μΈν°νμ΄μ€ λλΆμ Bκ° λ³κ²½λμ΄λ Aλ μ λ°κΏ μ μκ² λλ€. (λμ¨ν κ²°ν©)
Aκ° Bμ μμ‘΄μ μΌ λ
class A {
public void methodA (B b ) {
b. methodB ();
}
}
class B {
public void methodB () {
System.out. println ( "methodB()" );
}
}
class InterfaceTest {
public static void main (String args []) {
A a = new A ();
a. methodA ( new B ());
}
}
// Bμ κ΄κ³ μμ΄μ§ A
class A {
public void methodA (I i ) {
i. methodB ();
}
}
interface I {
void methodB ();
}
class B implemetns I {
public void methodB () {
System.out. println ( "methodB()" );
}
}
// Bλ₯Ό Cλ‘ λ³κ²½ μ Aλ λ³κ²½ μμ
class C implemetns I {
public void methodB () {
System.out. println ( "methodB() in C" );
}
}
κ°λ° μκ°μ λ¨μΆ
Aκ° Bμ μμ‘΄μ μΌ λ Bμ μΈν°νμ΄μ€λ₯Ό 미리 ꡬνν¨μΌλ‘μ¨ Bκ° μμ±λκΈ° μ Aλ₯Ό κ°λ°
λ³κ²½μ μ 리ν μ μ°ν μ€κ³κ° κ°λ₯
νμ€νκ° κ°λ₯ (Aκ° μμ‘΄νλ Bμ Cμ κ³΅ν΅ νμ€μ μꡬν μ μμ)
μλ‘ κ΄κ³μλ ν΄λμ€λ€μ κ΄κ³λ₯Ό λ§Ίμ΄μ€ μ μμ
// GroundUnit μμμΌλ‘ Marine, SCV, Tank κ° μκ³
// SCV, Tank λ§ repair() λ©μλλ₯Ό μΆκ°νκ³ μΆμ λ
// repairable μ΄λΌλ μΈν°νμ΄μ€λ₯Ό ꡬνν¨μΌλ‘μ¨ κ΄κ³μλ ν΄λμ€ κ°μ 곡ν΅μ μμ± κ°λ₯
void repair (Repariable r) {
if (r instanceof Unit) {
Unit u = (Unit)r;
while (u.hitPoint != u.MAX_HP) {
u.hitPoint ++ ;
}
}
}
40~41. default λ©μλ, static λ©μλ
μΈν°νμ΄μ€μ default λ©μλ, static λ©μλ μΆκ° κ°λ₯. (JDK 1.8 λΆν°)
μΈν°νμ΄μ€μ μλ‘μ΄ λ©μλ(μΆμ λ©μλ)λ₯Ό μΆκ°νκΈ° μ΄λ €μ.
κΈ°μ‘΄μ μΈν°νμ΄μ€λ₯Ό ꡬννλ λ€μμ ν΄λμ€κ° μΈν°νμ΄μ€μ μλ‘μ΄ λ©μλκ° μκ²Όμ λ κ°μ ν΄λΉ λ©μλλ₯Ό ꡬνν΄μΌ νμ
ν΄κ²°μ±
β λͺΈν΅μ΄ μλ default method
default λ©μλ = μΈμ€ν΄μ€ λ©μλ(μΈν°νμ΄μ€ μμΉ μλ°)
interface MyInterface {
void method ();
default void newMethod () { // λ΄μ© ꡬν }
}
default λ©μλκ° κΈ°μ‘΄μ λ©μλμ μΆ©λν λμ ν΄κ²°μ±
μ¬λ¬ μΈν°νμ΄μ€μ default λ©μλ κ°μ μΆ©λ
μΈν°νμ΄μ€λ₯Ό ꡬνν ν΄λμ€μμ default λ©μλλ₯Ό μ€λ²λΌμ΄λ©ν΄μΌ ν¨
default λ©μλμ μ‘°μ ν΄λμ€μ λ©μλ κ°μ μΆ©λ
μ‘°μ ν΄λμ€μ λ©μλκ° μμλκ³ , default λ©μλλ 무μ
42~44. λ΄λΆ ν΄λμ€μ μ’
λ₯, νΉμ§, μ μΈ
λ΄λΆ ν΄λμ€ (inner class)
ν΄λμ€ μμ ν΄λμ€
class A { // μΈλΆ ν΄λμ€
class B { // λ΄λΆ ν΄λμ€
// κ°μ²΄ μμ± μμ΄ Aμ λ©€λ² μ κ·Ό κ°λ₯
...
}
}
μ₯μ
λ΄λΆ ν΄λμ€μμ μΈλΆ ν΄λμ€μ λ©€λ²λ€μ μ½κ² μ κ·Όν μ μμ
μ½λμ 볡μ‘μ±μ μ€μΌ μ μμ (μΊ‘μν)
νΉμ§
λ΄λΆ ν΄λμ€μ μ’
λ₯μ μ ν¨λ²μ(scope)λ λ³μμ λμΌ
class Outer {
class InstanceInner { }
static class StaticInner { }
void myMethod () {
class LocalInner { }
}
}
λ΄λΆ ν΄λμ€ νΉμ§ μΈμ€ν΄μ€ ν΄λμ€ μΈλΆ ν΄λμ€μ λ©€λ²λ³μ μ μΈμμΉμ μ μΈ. μΈλΆ ν΄λμ€μ μΈμ€ν΄μ€ λ©€λ²μ²λΌ λ€λ£¨μ΄μ§. μ£Όλ‘ μΈλΆ ν΄λμ€μ μΈμ€ν΄μ€ λ©€λ²λ€κ³Ό κ΄λ ¨λ μμ
μ μ¬μ© static ν΄λμ€ μΈλΆ ν΄λμ€μ λ©€λ²λ³μ μ μΈμμΉμ μ μΈ μΈλΆ ν΄λμ€μ static λ©€λ²μ²λΌ λ€λ£¨μ΄μ§. μ£Όλ‘ μΈλΆ ν΄λμ€μ static λ©€λ², νΉν static λ©μλμ μ¬μ©λ λͺ©μ μΌλ‘ μ μΈ local ν΄λμ€ μΈλΆ ν΄λμ€μ λ©μλλ μ΄κΈ°ν λΈλ μμ μ μΈ μ μΈλ μμ λ΄λΆμμλ§ μ¬μ© κ°λ₯ μ΅λͺ
ν΄λμ€ ν΄λμ€μ μ μΈκ³Ό κ°μ²΄μ μμ±μ λμμ νλ μ΄λ¦μλ ν΄λμ€ (μΌνμ©)
45~50. λ΄λΆ ν΄λμ€μ μ μ΄μμ μ κ·Όμ±
λ΄λΆ ν΄λμ€μ μ μ΄μλ λ³μμ μ¬μ© κ°λ₯ν μ μ΄μμ λμΌ
μΌλ° ν΄λμ€λ default λ public λ§ κ°λ₯
λ΄λΆ ν΄λμ€λ protected λ private λ κ°λ₯
class Outer {
private class InstanceInner { }
protected static class StaticInner { }
void myMethod () {
class LocalInner { }
}
}
λ΄λΆ ν΄λμ€μ μ μ΄μμ μ κ·Όμ± - μμ
class Ex7_12 {
class InstanceInner {
int iv = 100 ;
// static int cv = 100; // μλ¬. static λ³μλ₯Ό μ μΈν μ μμ
final static int CONST = 100 ; // μμλ νμ©
}
static class StaticInner {
int iv = 200 ;
static int cv = 200 ; // static ν΄λμ€λ§ static λ©€λ² μ μ κ°λ₯
}
void myMethod () {
class LocalInner {
int iv = 300 ;
// static int cv = 300; // μλ¬. static λ³μλ₯Ό μ μΈν μ μμ
final static int CONST = 300 ; // μμλ νμ©
}
}
public static void main ( String [] args ) {
System.out. println (InstanceInner.CONST);
System.out. println (StaticInner.cv);
// System.out.println(LocalInner.CONST); // μλ¬. λ©μλ λ΄μμλ§ κ°λ₯
}
}
51~52. μ΅λͺ
ν΄λμ€
μ΄λ¦μ΄ μλ μΌνμ© ν΄λμ€. μ μμ μμ±μ λμμ
new μ‘°μν΄λμ€μ΄λ¦() {
// λ©€λ² μ μΈ
}
new ꡬνμΈν°νμ΄μ€μ΄λ¦() {
// λ©€λ² μ μΈ
}
μ΅λͺ
ν΄λμ€ - μμ
import java.awt. * ;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class Ex7_18 {
public static void main ( String [] args ) {
Button b = new Button ();
// ν΄λμ€ μ μμ κ°μ²΄ μμ± λ°λ‘
b. addActionListener ( new EventHandler ());
// ν΄λμ€ μ μμ κ°μ²΄ μμ± λμμ
b. addActionListener ( new ActionListener () {
@ Override
public void actionPerformed (ActionEvent e ) {
System.out. println ( "ActionEvent occurred!!" );
}
});
}
}
class EventHandler implements ActionListener {
public void actionPerformed (ActionEvent e ) {
System.out. println ( "ActionEvent occurred!!" );
}
}