Java Seminar Chapter3
Static
Static public class Circle { private int r; private float pi = 3.14f; public Circle(int r) { this.r = r; } public void setPi(float pi) { this.pi = pi; public float getArea() { return r * r * pi; public class Main { public static void main(String[] args) { Circle c1 = new Circle(5); Circle c2 = new Circle(7); System.out.println(c1.getArea()); System.out.println(c2.getArea()); c1.setPi(3); c2.setPi(3); }
Static public class Circle { private int r; private static float pi = 3.14f; public Circle(int r) { this.r = r; } public void setPi(float pi) { this.pi = pi; public static float getArea() { return r * r * pi; public class Main { public static void main(String[] args) { Circle c1 = new Circle(5); Circle c2 = new Circle(7); System.out.println(c1.getArea()); System.out.println(c2.getArea()); c1.setPi(3); }
Static public class Main { public static void main(String[] args) { Circle c1 = new Circle(5); Circle c2 = new Circle(7); System.out.println(c1.getArea()); System.out.println(c2.getArea()); Circle.setPi(3); }
Inheritance(상속) static규칙 1.static 지시자가 붙은 field나 method는 단 한가지만 존재한다. 2.static 지시자가 붙은 field나 method는 이클립스에서 이탤릭체로 표시된다. 3.static 지시자가 붙은 field나 method는 인스턴스를 생성하지 않고 호출가능 4.static 지시자가 붙은 method는 static field와 method만 사용가능. 5.static 지시자가 붙은 method는 instance field와 method는 사용 불가.
Inheritance(상속)
Inheritance(상속) package com.jiharu.core; public class Member { private String name; private String gender; private int age; public Member(String name, String gender, int age) { this.name = name; this.gender = gender; this.age = age; } public String getName() { return name; public void setName(String name) { public String getGender() { return gender; public void setGender(String gender) { this.gender = gender; } public int getAge() { return age; public void setAge(int age) { this.age = age; public String toString() { return "Member [name=" + name + ", gender=" + gender + ", age=" + age + "]";
Inheritance(상속) 회원(Member)이 가진 속성(Field) 운영진(Admin)이 가진 속성(Field) 이름(name) 성별(gender) 나이(age) 운영진(Admin)이 가진 속성(Field) 이름(name) 성별(gender) 나이(age) 직책(rank)
Inheritance(상속) 이렇게 않 씀! package com.jiharu.core; public class Admin { private String name; private String gender; private int age; private String rank; public Admin(String name, String gender, int age) { this.name = name; this.gender = gender; this.age = age; this.rank = rank; } public String getName() { return name; public void setName(String name) { public String getGender() { return gender; public void setGender(String gender) { this.gender = gender; } public int getAge() { return age; public void setAge(int age) { this.age = age; public int getRank() { return rank; public void setRank(int rank) { this.rank = rank; public String toString() { return ”Admin [name=" + name + ", gender=" + gender + ", age=" + age + ", rank=" + rank + "]"; 이렇게 않 씀!
Inheritance(상속)
Inheritance(상속)
Inheritance(상속)
Inheritance(상속)
Inheritance(상속)
Inheritance(상속)
Inheritance(상속) 상속 규칙 1.상속을 하면 상속 받는 클래스는 상속하는 클래스의 모든 필드, 메소드, 생성자가 상속된다. 2.기본적으로 모든 클래스는 Object클래스를 상속받는다. 3.private변수는 상속관계에서도 접근할 수 없다. 존재치 않는건 아니지만 접근이 불가능 4.자식 클래스는 부모 클래스의 생성자를 무조건적으로 호출해야만 한다. 용어 정리 Super Class – 상속을 해준 클래스를 super, parents클래스라고 부른다. Sub Class – 상속을 받은 클래스를 sub, derived, child클래스라고 부른다.
Inheritance(상속) package com.jiharu.core; public class Admin extends Member { private String rank; public Admin(String name, String gender, int age, String rank) { super(name, gender, age); this.rank = rank; } public String getRank() { return rank; public void setRank(String rank) {
Inheritance(상속) Admin클래스의 info메소드 부모 클래스에서 name과 age와 gender는 private이므로 접근이 불가능하다.
상속 관계에서 protected를 사용하면 접근가능 Inheritance(상속) 상속 관계에서 protected를 사용하면 접근가능
Inheritance(상속) package com.jiharu.main; import java.awt.BorderLayout; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import com.jiharu.core.Admin; import com.jiharu.core.Member; public class Main { public static void main(String[] args) { JFrame fr = new JFrame("This 프레임"); JPanel pn = new JPanel(); Admin admin = new Admin("김태정", "남자", 27, "교수"); Member mem = new Member("피카츄", "중성", 100); pn.setLayout(new BorderLayout()); fr.setContentPane(pn); JLabel lbl1 = new JLabel(admin.toString()); JLabel lbl2 = new JLabel(mem.toString()); pn.add(lbl1, BorderLayout.NORTH); pn.add(lbl2, BorderLayout.SOUTH); fr.setSize(600, 400); fr.setVisible(true); }
Inheritance(상속) Admin 클래스가Member의 toString 메소드를 그대로 사용하게 된다.
Inheritance(상속) super와 오버라이딩(Overwrriding) public String toString() { return "Admin [name=" + super.name + ", gender=" + this.gender + ", age=" + age + ", rank=" + rank +"]"; } super – 부모클래스의 메소드나 필드를 접근할 때 사용. this와 마찬가지로 super()는 생성자를 의미한다. 오버라이딩 – 상속관계에서 메소드를 재정의 할때 사용. 해당 메소드를 덮게 된다.
Inheritance(상속) super와 오버라이딩(Overwrriding) Main을 수정하지 않고도 변경된 것을 확인 가능
Inheritance(상속) 타입캐스팅 package com.jiharu.main; import java.awt.BorderLayout; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import com.jiharu.core.Admin; import com.jiharu.core.Member; public class Main { public static void main(String[] args) { JFrame fr = new JFrame("This 프레임"); JPanel pn = new JPanel(); Member admin = new Admin("김태정", "남자", 27, "교수"); Member mem = new Member("피카츄", "중성", 100); pn.setLayout(new BorderLayout()); fr.setContentPane(pn); JLabel lbl1 = new JLabel(admin.toString()); JLabel lbl2 = new JLabel(mem.toString()); pn.add(lbl1, BorderLayout.NORTH); pn.add(lbl2, BorderLayout.SOUTH); fr.setSize(600, 400); fr.setVisible(true); }
Inheritance(상속) 타입캐스팅 Admin이 Member를 상속받을 경우(Member가 Admin의 super클래스) Member admin = new Admin("김태정", "남자", 27, "교수");-① Admin mem = (Admin)new Member("피카츄", "중성", 100);-② 자바의 경우 왼쪽 변수와 오른쪽 변수의 타입은 항상 동등해야한다. ①번과 같이 super=sub관계를 up캐스팅이라고 한다. 이 캐스팅은 명시적으로 캐스팅하지 않아도 된다.(캐스팅 연산자 생략 가능) ②번과 같이 sub=super관계를 down캐스팅이라고 한다. 이 캐스팅의 경우에는 반드시 명시적으로 캐스팅 해야한다.
Inheritance(상속) 타입캐스팅 Admin 상속시 Admin은 Member를 모두 가진다. Member 그러나 역은 성립하지 않는다. 따라서 down캐스팅시 문제가 발생한다. name gender age Member rank
Inheritance(상속) 이 코드가 문제없이 실행되지 않는다. 타입캐스팅 package com.jiharu.main; import java.awt.BorderLayout; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import com.jiharu.core.Admin; import com.jiharu.core.Member; public class Main { public static void main(String[] args) { JFrame fr = new JFrame("This 프레임"); JPanel pn = new JPanel(); Admin admin = new Admin("김태정", "남자", 27, "교수"); Admin mem = (Admin) new Member("피카츄", "중성", 100); pn.setLayout(new BorderLayout()); fr.setContentPane(pn); JLabel lbl1 = new JLabel(admin.toString()); JLabel lbl2 = new JLabel(mem.toString()); pn.add(lbl1, BorderLayout.NORTH); pn.add(lbl2, BorderLayout.SOUTH); fr.setSize(600, 400); fr.setVisible(true); }
Inheritance(상속) 원래의 정체가 Admin이어야한다. 타입캐스팅 package com.jiharu.main; import java.awt.BorderLayout; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import com.jiharu.core.Admin; import com.jiharu.core.Member; public class Main { public static void main(String[] args) { JFrame fr = new JFrame("This 프레임"); JPanel pn = new JPanel(); Admin admin = new Admin("김태정", "남자", 27, "교수"); Member mem0 = new Admin("피카츄", "중성", 100, "동물"); Admin mem = mem0; pn.setLayout(new BorderLayout()); fr.setContentPane(pn); JLabel lbl1 = new JLabel(admin.toString()); JLabel lbl2 = new JLabel(mem.toString()); pn.add(lbl1, BorderLayout.NORTH); pn.add(lbl2, BorderLayout.SOUTH); fr.setSize(600, 400); fr.setVisible(true); }
Inheritance(상속) Abstract public int getY() { return y; } public void setY(int y) { this.y = y; public int getWidth() { return width; public void setWidth(int width) { this.width = width; public int getHeight() { return height; public void setHeight(int height) { this.height = height; public float getArea() { return 0; }; Abstract package com.jiharu.shape; public class Shape { private int x; private int y; private int width; private int height; public Shape(int x, int y, int width, int height) { this.x = x; this.y = y; this.width = width; this.height = height; } public int getX() { return x; public void setX(int x) {
Shape에서 getArea는 계륵 같은 존재 Inheritance(상속) Abstract package com.jiharu.shape; public class Circle extends Shape { public Circle(int x, int y, int width, int height) { super(x, y, width, height); } public float getArea() { return getWidth() / 2 * getHeight() / 2 * 3.14f; public class Rectangle extends Shape { public Rectangle(int x, int y, int width, int height) { return getWidth() * getHeight(); Shape에서 getArea는 계륵 같은 존재
Inheritance(상속) Abstract abstract 클래스 public int getY() { return y; } public void setY(int y) { this.y = y; public int getWidth() { return width; public void setWidth(int width) { this.width = width; public int getHeight() { return height; public void setHeight(int height) { this.height = height; abstract public float getArea() ; Abstract package com.jiharu.shape; abstract public class Shape { private int x; private int y; private int width; private int height; public Shape(int x, int y, int width, int height) { this.x = x; this.y = y; this.width = width; this.height = height; } public int getX() { return x; public void setX(int x) { abstract 클래스
Inheritance(상속) Abstract abstract규칙 1.abstract 메소드는 본체를 가질 수없다. 2.하나라도 abstract 메소드가 존재한다면 자동으로 abstract class가 된다. 3.abstact클래스는 반드시 상속해서 사용한다. 4.상속받은 abstact클래스의 abstact메소드를 반드시 오버라이딩해준다.
그럼 모든 method가 abstract다! Inheritance(상속) Interface 그럼 모든 method가 abstract다! = 실체가 없다? interface
Inheritance(상속) Interface
Inheritance(상속) Interface
Inheritance(상속) Interface package com.jiharu.person; public interface Person { public final static int foot = 2; public static int hand = 2; public int mouth = 1; int eye = 2; public abstract void run(); public void sleep(); void eat(); static void breath() { System.out.println("헉,헉, 살기 위해 숨쉼!"); } default void eatChicken() { System.out.println("치킨 맛있엉!"); field는 자동으로 public final static이 되며 method 는 public abstract가 된다.
Inheritance(상속) Interface default 메소드는 interface에서만 존재. package com.jiharu.person; public interface Person { public final static int foot = 2; public static int hand = 2; public int mouth = 1; int eye = 2; public abstract void run(); public void sleep(); void eat(); static void breath() { System.out.println("헉,헉, 살기 위해 숨쉼!"); } default void eatChicken() { System.out.println("치킨 맛있엉!"); default 메소드는 interface에서만 존재. static 메소드는 반드시 본체를 기술해야함.
Inheritance(상속) Interface를 상속받기
Inheritance(상속) Interface를 상속받기
Inheritance(상속) Interface를 상속받기 @Override는 상속받았음을 뜻함. 없어도 무관. //TODO는 자동완성으로 만들어 졌음을 알림. 없어도 무관.
Inheritance(상속) Interface interface규칙 1.메소드는 static과 default를 제외하고 abstract만 가질 수 있으며 실전에서는 static과 default를 가지는 일은 극히 드물다. 그러므로 abstract만 가진다고 생각해도 당장은 무관하다. 2.필드는 무조건 final이므로 상수이다. 즉 변수를 가질 수 없다. 3.무조건 상속해서 사용한다.
Nested Class
Nested Class 소스 파일내에 public outter 클래스는 단 한 개만 존재가능 //Outter.java public class Outter { public class Inner { } public void method() { class Local{ class Source { 클래스 내의 클래스를 inner 클래스라 한다 inner class는 접근 제한자 지정 가능 메소드 내의 클래스를 local 클래스라 한다 접근 제한자 지정이 불가능 소스 파일내에 package outter 클래스는 여러 개 선언 가능
Nested Class 메소드내에서만 사용가능 근데 안씀-- package 내에서만 사용가능 //Outter.java public class Main { public static void main(String[] args) { Outter o = new Outter(); Outter.Inner i = o.new Inner(); } //Outter.java public class Outter { public class Inner { } public void method() { class Local{ class Source { 메소드내에서만 사용가능 근데 안씀-- package 내에서만 사용가능
익명 클래스(Anonymus Class) Nested Class package com.jiharu.person; public class Main { public static void main(String[] args) { Person kimtaejung = new Person() { @Override public void sleep() { System.out.println("푹 잘잠"); } public void run() { System.out.println("두칸씩 뜀"); public void eat() { System.out.println("고기만 먹음"); }; kimtaejung.run(); kimtaejung.eatChicken(); Person.breath(); 익명 클래스(Anonymus Class) package com.jiharu.person; public interface Person { public final static int foot = 2; public static int hand = 2; public int mouth = 1; int eye = 2; public abstract void run(); public void sleep(); void eat(); static void breath() { System.out.println("헉,헉, 살기 위해 숨쉼!"); } default void eatChicken() { System.out.println("치킨 맛있엉!");
Nested Class 익명클래스란? 1.익명 클래스란 생성자 뒤에 바로 {}붙혀서 만드는 클래스를 의미. 2.단 한번밖에 사용못함, 재활용 불가 3.익명클래스는 상속+중첩클래스로 취급 4.익명클래스인 이유는 바이너리를 보면 이름이 없이 숫자만 적혀있다. 그래서 익명클래스라 부름
Nested Class instanceof 연산자 package com.jiharu.person; public class Main { public static void main(String[] args) { Person kimtaejung = new Person() { @Override public void sleep() { System.out.println("푹 잘잠"); } public void run() { System.out.println("두칸씩 뜀"); public void eat() { System.out.println("고기만 먹음"); }; kimtaejung.run(); kimtaejung.eatChicken(); Person.breath(); System.out.println(kimtaejung instanceof Person); System.out.println(kimtaejung instanceof Object); instanceof 연산자 1.이 연산자는 상속관계인지 아닌지 확인할 수 있다. 상속관계에 있다면 true를 반환 2.사용 방식은 (변수)instanceof(클래스) 형식으로 사용