[계산] class Friend { protected String name; protected String phone; public Friend(String name, String phone) { this.name = name; this.phone = phone; } public void showInfo() { System.out.println("이름: " + this.name); System.out.println("전화: " + this.phone); } } class UnivFriend extends Friend { protected String major; public UnivFriend(String name, String major, String phone) { super(name, phone); this.major = major; } @Override public void showInfo() { super.showInfo(); System.out.println("전공: " + this.major); } } class CompFriend extends Friend { protected String department; public CompFriend(String name, String department, String phone) { super(name, phone); this.department = department; } @Override public void showInfo() { super.showInfo(); System.out.println("부서: " + this.department); } } public class Test49 { public static void main(String[] args) { Friend[] frns = new Friend[10]; int cnt = 0; frns[cnt++] = new UnivFriend("LEE", "Computer", "010-333-555"); frns[cnt++] = new UnivFriend("SEO", "Electronics", "010-222-444"); frns[cnt++] = new CompFriend("YOON", "R&D 1", "02-123-999"); frns[cnt++] = new CompFriend("PARK", "R&D 2", "02-321-777"); // 모든 동창 및 동료의 정보 전체 출력 for (int i = 0; i < cnt; i++) { frns[i].showInfo(); // 오버라이딩 한 메소드가 호출된다. System.out.println(); } } }
[결과값] 이름: LEE 전화: 010-333-555 전공: Computer 이름: SEO 전화: 010-222-444 전공: Electronics 이름: YOON 전화: 02-123-999 부서: R&D 1 이름: PARK 전화: 02-321-777 부서: R&D 2
[계산] import java.util.Scanner; class Grade { private int eng; private int math; private int kor; public Grade(int eng, int math, int kor) { this.eng = eng; this.math = math; this.kor = kor; } public double getSum() { return this.eng + this.math + this.kor; } public double getAvg() { return (this.eng + this.math + this.kor) / 3.0; } } public class Test49 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); boolean run = true; while (run) { System.out.print("영어: "); int eng = sc.nextInt(); System.out.print("수학: "); int math = sc.nextInt(); System.out.print("국어: "); int kor = sc.nextInt(); Grade grade = new Grade(eng, math, kor); System.out.println("총점: " + grade.getSum()); System.out.println("평균: " + grade.getAvg()); System.out.println("계속 하시겠습니꺄? y / n"); String yOrN = sc.next(); if (yOrN.equals("y") || yOrN.equals("Y")) { continue; } else { System.out.println("종료입니다."); break; } } } }
[결과값] 영어: 76 수학: 90 국어: 100 총점: 266.0 평균: 88.66666666666667 계속 하시겠습니꺄? y / n y 영어: 76 수학: 90 국어: 100 총점: 266.0 평균: 88.66666666666667 계속 하시겠습니꺄? y / n n 종료입니다.
Object = 공통적으로 사용될 만한 함수(11개)를 부모로 올림
스레드 관련 5개 빼고, 오버라이딩 자주 사용하는 3개 - toString / hashCode / equals
부모로 올리면 다형성과 오버라이딩 활용 가능
모든 클래스는 Object를 상속한다.
・Object(11가지)
hashCode()
toString()
equals()
getClass()
-스레드관련
notify()
notifyAll()
wait()
wait(...)
clone()
finalize()
・함수 오버로딩
String.valueOf() : 모든 데이터 타입을 문자열로 바꿔줌
[계산] class C extends Object { } public class Wrapping { public static void main(String[] args) { C c = new C(); System.out.println(c); // Object에서 호출해온다. // public String toString() { // return getClass().getName() + "@" + Integer.toHexString(hashCode()); // toHexString : 16진수로 뿌리는 hasCode() 주소값 } }
public final class MyLastCls{...}
⇒MyLastCls 클래스는 다른 클래스가 상속할 수 없음
class Simple{public final void func(int n)}
⇒아래의 메소드는 다른 클래스에서 오버라이딩 할 수 없음
[계산] // 1. 컴파일러 알려주는 역할 // 2. 애너테이션 넣든, 안넣든 프로그램에는 기본적으로 영향을 주지 못함 // 3. 1.5 버전부터 지원 // 4. 애너테이션 자체가 하나의 기능(함수역할을 함)이 들어가는 경우가 많음 // @Override // 애너테이션 // public String toString() { // return "메롱!!" // // } class ParentAdder { public int add(int a, int b) { return a + b; } } class ChildAdder extends ParentAdder { // @Override // 개발자가 부모에 있는 함수(똑같은 이름이 있는)를 체크해서 없으면 컴파일 에러를 내라 // 상속으로 두 클래스에 걸쳐서 형성된 메소드 오버로딩이다. // 오버라이딩이 아니기 때문에 컴파일 오류 발생 public double add(double a, double b) { System.out.println("덧셈을 진행합니다."); return a + b; } } public class Override { public static void main(String[] args) { } }
1. interface = 상수와 + abstract(추상)함수(바디가 없는 함수)
2. interface에는 변수가 올 수 없다.
인터페이스(interface) = 자손이 구현하라. (갑→을이 구현)
2개 이상의 클래스를 상속받을 수 있다.
예시)
class C implements A, B{}
[계산] //1. interface = 상수와 + abstract(추상)함수(바디가 없는 함수) //2. interface에는 변수가 올 수 없다. // 인터페이스(interface) = 자손이 구현하라. interface Printable { void print(String doc); // 추상 메소드 public abstract void print(String doc) 이 생략되어 있다. } //인터페이스의 정의! 메소드의 몸체를 갖지 않는다. //따라서 인스턴스 생성 불가! 참조변수 선언 가능! class Printer implements Printable { // implements : interface를 구현한다. @Override public void print(String doc) { System.out.println(doc); } } //인터페이스를 구현하는 클래스! //구현하는 메소드와 추상 메소드 사이에도 메소드 오버라이딩 관계 성립, 따라서 Override 붙일 수 있음. public class InterFace { public static void main(String[] args) { Printable prn = new Printer(); prn.print("Hello Java"); } }
[결과값] Hello Java
1.자손이 구현가능
2.interface = 표준(강제)
=외주 = 드라이버
[계산] class Printer implements Printable { // implements : interface를 구현한다. @Override public void print(String doc) { System.out.println(doc); } } interface ICalculator { // I = interface를 뜻함. public abstract int add(int num, int num2); public abstract int sub(int num, int num2); public abstract int mul(int num, int num2); int div(int num, int num2); } class MyCalculator implements ICalculator { @Override public int add(int num, int num2) { return num + num2; } @Override public int sub(int num, int num2) { return num - num2; } @Override public int mul(int num, int num2) { return num * num2; } @Override public int div(int num, int num2) { return num / num2; } } public class InterFace { public static void main(String[] args) { ICalculator calculator = new MyCalculator(); System.out.println(calculator.add(10, 20)); System.out.println(calculator.sub(10, 20)); System.out.println(calculator.mul(10, 20)); System.out.println(calculator.div(10, 20)); } }
[결과값] 30 -10 200 0