Lab 4
ADT Design 클래스로정의됨. 모든객체들은힙영역에할당됨. 캡슐화 (Encapsulation) : Data representation + Operation 정보은닉 (Information Hiding) : Opertion부분은가려져있고, 사용자가 operation으로만사용가능해야함.
클래스정의의형태 public class Person { private String name; public int age; public Person() { public Person(String s) { name = s; public String getname() { return name; 생성자 : 클래스의이름과동일한메소드, 클래스의객체가생성될때호출되는메소드메소드 : 실행가능한함수, 객체의행위를구현메소드오버로딩 : 1 메소드이름동일 2 메소드인자의개수가서로다르거나, 메소드인자의타입이서로달라야함. 3 리턴타입만다른경우에는에러
객체의생성 public static void main (String args[]) { Person aperson; aperson = new Person( 홍길동 ); aperson.age = 30; String s = aperson.getname(); 객체에대한레퍼런스변수 aperson 을선언한뒤, new 를통해서 Person 객체를생성하고있다.
멤버접근지정자 멤버에접근하는클래스 멤버의접근지정자 default private protected public 같은패키지의클래스 O X O O 다른패키지의클래스 X X X O
멤버접근지정자 public 인 name 에대해서는바로값지정이가능하지만, private 으로선언된 age 의경우바로선언하려고하면에러가발생한다. 이는 private 의경우, 서로다른클래스에선언되어있기때문이다. 때문에클래스내부에서 get/set 메소드를만들어서접근해야한다. class Person { public String name; private int age; int num; public int getage() { return age; public void setage(int value) { age = value; public class Access { public static void main(string[] args) { Person aperson = new Person(); aperson.name = 홍길동 ; aperson.setage(20); aperson.num = 10;
Class Hierarchy - Casting 객체의타입변환 업캐스팅 : 서브클래스객체가슈퍼클래스타입으로변환되는것 다운캐스팅 : 업캐스팅된것을다시원래대로되돌리는것, 명시적으로타입지정이필요.
Class Hierarchy - Casting
Class Hierarchy - Casting C++ 의경우 GUN 을 weapon 으로바꾸었다기보다는메모리에는 GUN 고대로존재하되 ( 동적할당 ) 그시작점을가리키는포인터를부모로가리키겠다는의미이다.
class Person { String name; String id; public Person(String name) { this.name = name; class Student extends Person { String grade; String department; public Student(String name) { super(name); public class Casting { public static void main(string[] args) { Person p = new Student(" 홍길동 "); // 1 업캐스팅 System.out.println(p.name); p.grade = "A"; p.department = " 컴퓨터 "; Student s = (Student)p; // 2 다운캐스팅 System.out.println(s.name); s.grade = "A";
Class Hierarchy - Overriding 슈퍼클래스와서브클래스의메소드사이에발생하는관계. 슈퍼클래스의메소드를동일한이름으로서브클래스에서재작성하는것. super 키워드를통해서슈퍼클래스에대한멤버와메소드에접근가능.
Class Hierarchy - Overriding 오버라이딩의조건 1 슈퍼클래스의메소드와완전히동일한메소드를재정의. 2 슈퍼클래스메소드의접근지정자보다접근의범위가좁아질수없음. 3 리턴타입만다를수없음.
Class Hierarchy - Overriding
Class Hierarchy - Overriding public class Overriding { public static void main(string[] args) { Person p = new Person(); Student st = new Student(); Person p1 = new Researcher(); Person p2 = st; p.who(); st.who(); p1.who(); p2.who(); 출력결과 : Person / Student / Researcher / Student Student 와 Researcher 의 who() 메소드는오버라이딩된형태이다. 그렇기때문에자식클래스에있는함수가실행된다.
Method Overloading vs Overriding 정의 Overloading 같은클래스나상속관계에서동일한이름의메소드중복작성 Overriding 서브클래스에서슈퍼클래스에있는메소드와동일한이름의메소드작성 관계같은클래스나상속관계상속관계 목적 조건 이름이같은여러개의메소드를중복정의하여사용의편리성향상 메소드이름동일, 메소드의인자의개수나인자의타입이달라야함. 서브클래스에서새로운기능의메소드를재정의 메소드의이름, 매개변수의형태등이모두동일 바인딩정적바인딩동적바인딩
Abstract Class 추상클래스의상속 추상클래스를상속받으면상속받은서브클래스는추상클래스가됨. 서브클래스가추상클래스가되지않기위해서는추상메소드를모두오버라이딩해야함.
Interfaces Abstract Class
Interfaces 추상클래스의한종류로, 다중상속이가능하게함. implements 키워드는인터페이스의추상메소드를클래스에서구현하는것을말함.
Interfaces 인터페이스의특징 1 추상클래스와다르게반드시추상메소드와상수만으로구성 2 모든메소드는 abstract public이며생략가능함. 3 상수도 public static final을생략하여선언가능함. 4 인터페이스의객체를생성할수없음. 5 다른인터페이스에상속될수있음. 6 인터페이스도레퍼런스변수의타입으로사용가능.
interface CanFight { void fight(); interface CanSwim { void swim(); interface CanFly { void fly(); class ActionCharacter { public void fight() { System.out.println("fight"); class Hero extends ActionCharacter implements CanFight, CanSwim, CanFly { public void swim() { System.out.println("swim"); public void fly() { System.out.println("fly"); public class Adventure { public static void t(canfight x) { x.fight(); public static void u(canswim x) { x.swim(); public static void v(canfly x) { x.fly(); public static void w(actioncharacter x) { x.fight(); public static void main(string[] args) { Hero h = new Hero(); t(h); // Treat it as a CanFight u(h); // Treat it as a CanSwim v(h); // Treat it as a CanFly w(h); // Treat it as an ActionCharacter
interface Monster { void menace(); interface DangerousMonster extends Monster { void destroy(); interface Lethal { void kill(); class DragonZilla implements DangerousMonster { public void menace() { System.out.println("menace1"); public void destroy() { System.out.println("destory1"); interface Vampire extends DangerousMonster, Lethal { void drinkblood(); class VeryBadVampire implements Vampire { public void menace() { System.out.println("menace2"); public void destroy() { System.out.println("destroy2"); public void kill() { System.out.println("kill2"); public void drinkblood() { System.out.println("drinkBlood2");
public class HorrorShow { static void u(monster b) { b.menace(); static void v(dangerousmonster d) { d.menace(); d.destroy(); static void w(lethal l) { l.kill(); public static void main(string[] args) { DangerousMonster barney = new DragonZilla(); System.out.println("1"); u(barney); System.out.println("2"); v(barney); Vampire vlad = new VeryBadVampire(); System.out.println("3"); u(vlad); System.out.println("4"); v(vlad); System.out.println("5"); w(vlad); 인터페이스를만들때, 다중인터페이스상속이가능함. 인터페이스를통한다중상속이구현되었음을확인할수있음.
인터페이스 vs 추상클래스