Ⅰ. Overloading(오버로딩)
-- Package 1개(my.day13.e.methodOverloading)와 Class 2개(OverloadingTest, MainApp)을 생성한다.
public class OverloadingTest {
public int sum(int a, int b) {
return a+b;
}
}
public class MainApp {
public static void main(String[] args) {
OverloadingTest ot = new OverloadingTest();
int total = ot.sum(10,20);
System.out.println(total);
}
}
-- sum이라는 이름의 함수가 이미 존재하고 있는데 다시 sum이라는 이름의 함수를 생성하면 원래는 오류가 발생한다.
-- overloading은 한 클래스 내에서 같은 이름의 함수를 가질 수 있게 해 준다.
-- method 명이 같아도 파라미터의 개수 또는 파라미터의 데이터 타입이 다르면 다른 함수로 인식한다.
-- overloading은 파라미터와 관계가 있을 뿐 리턴 타입 또는 접근제한자와는 관계 없기 때문에 리턴타입과 접근제한자가 달라도 파라미터가 같다면 같은 함수로 인식하여 오류가 발생한다.
▶▶ 오버라이딩과 오버로딩의 차이점?
: 오버라이딩 되어진 메소드의 접근제한자는 부모클래스의 메소드 접근제한자와 같거나 접근 허용을 더 크게 해 주어야 한다. 그러나 오버로딩은 메소드의 접근제한자와는 아무 상관이 없다.
Ⅱ. final(예약어)
-- Package 1개(my.day14.a.finalTest)와 Class 3개(MainApp, Parent, Child)를 생성한다.
-- Package를 생성할 때 final은 예약어이므로 Package명이 final로 끝나면 생성되지 않으므로 Test를 추가하였다.
-- MainApp은 main 함수를 포함한다.
-- Class Child는 Class Parent를 부모클래스로 지정한다.
public class Parent {
public String name = "홍길동";
public int point = 100;
}
public class Child extends Parent {
void childInfo() {
super.name = "이순신"; // 상속을 받아 왔기 때문에 name 변수 사용할 수 있음
super.point = 2000;
String str = "성명은 "+super.name+", 포인트는 "+super.point;
System.out.println(str);
}
}
public class MainApp {
public static void main(String[] args) {
Child cd = new Child();
cd.childInfo();
}
}
▷결과
성명은 이순신, 포인트는 2000
-- 부모 클래스(Parent)에서 상속받은 값을 자식 클래스(Child)에서 값을 변경할 수 있다.
public class Parent {
public final String name = "홍길동";
public final int point = 100;
}
-- final 예약어를 사용하면 부모 클래스에서 상속된 값을 자식 클래스에서 바꿀 수 없다.
-- 상수처럼 사용하는 값에 사용한다. (상수변수)
public final double PI = 3.141592;
-- 상수변수는 가독성을 위해 모든 글자를 대문자로 표현한다.
-- final로 지정된 method는 override가 불가하다.
public class Parent {
public void methodTest1() {
System.out.println("== 메소드 테스트 1 입니다. ==");
}
public final void methodTest2() {
System.out.println("== 메소드 테스트 2 입니다. ==");
}
}
-- final로 지정된 Class는 다른 클래스에서 상속이 불가하다.
Ⅲ. Interface(인터페이스)
-- 인터페이스란 오로지 미완성메소드(추상메소드)와 final변수로만 이루어진 것을 말한다.
package my.day14.c.interfaceTest;
public interface InterMember {
String name = "홍길동";
}
-- public final 이 생략되어져 있다.
-- public final String name = "홍길동"; 와 같은 말이다.
package my.day14.c.interfaceTest;
public interface InterMember {
String viewInfo(String str);
}
-- public abstract 이 생략되어져 있다.
-- public abstract String viewInfo(String str); 와 같은 말이다.
-- 접근제한자는 public만 사용 가능하다.
▷▷ 추상클래스와 인터페이스 중에 어떤 것이 더 추상화되어 있는가?
: 추상클래스는 추상메소드를 포함하여 일반메소드도 사용 가능하지만 인터페이스는 오로지 추상메소드만 가능하
다. 따라서 인터페이스가 더 추상화되어있다.
-- Package 1개(my.day14.c.interfaceTest)와 Class 2개(Gujikja, Company), Interface 1개를 (InterMember)를 생성한다.
-- Class Gujikja, Company에 Interface InterMember를 implements 한다.
-- 추상 메소드를 Override 한다. (클래스 명 빨간줄에 커서를 대고 add unimplements method 선택)
public interface InterMember {
String name = "홍길동";
String viewInfo(String str);
}
public class Gujikja implements InterMember{
private String userid;
private int hopeMoney;
public Gujikja() {}
public Gujikja(String userid, int hopeMoney) {
this.userid = userid;
this.hopeMoney = hopeMoney;
}
public String getUserid() {
return userid;
}
public void setUserid(String userid) {
this.userid = userid;
}
public int getHopeMoney() {
return hopeMoney;
}
public void setHopeMoney(int hopeMoney) {
this.hopeMoney = hopeMoney;
}
@Override
public String viewInfo(String userid) {
String result = null;
if(userid != null && userid.equals(this.userid)) {
result = "1. 사용자ID: "+this.userid+"\n"+
"2. 희망연봉 : "+this.hopeMoney+"만원\n";
}
return result;
}
}
public class Company implements InterMember {
private String compid;
private String jobType;
public Company() {}
public Company(String compid, String jobType) {
this.compid = compid;
this.jobType = jobType;
}
public String getCompid() {
return compid;
}
public void setCompid(String compid) {
this.compid = compid;
}
public String getJobType() {
return jobType;
}
public void setJobType(String jobType) {
this.jobType = jobType;
}
@Override
public String viewInfo(String compid) {
String result = null;
if (compid != null && // nullpointerException 주의
compid.equals(this.compid)) {
result = "1. 회사ID: " + this.compid + "\n" +
"2. 직종 : " + this.jobType + "\n";
}
return result;
}
}
public class MainApp {
public static void main(String[] args) {
InterMember[] memArr = new InterMember[6];
memArr[0] = new Gujikja("leess", 5000);
memArr[1] = new Gujikja("eomjh", 6000);
memArr[2] = new Company("samsung", "제조업");
memArr[3] = new Company("LG", "서비스업");
// memArr[4] <== null
// memArr[5] <== null
System.out.println(memArr[0].name); // 홍길동
System.out.println(memArr[1].name); // 홍길동
String str = "eomjh";
for (InterMember intermem : memArr) {
if (intermem != null &&
intermem.viewInfo(str) != null) {
System.out.println(intermem.viewInfo(str));
break;
}
}
}
}
▷결과
홍길동
홍길동
1. 사용자ID: eomjh
2. 희망연봉 : 6000만원
문제1 ▷▷ 배열을 이용해 eomjh, LG를 찾아 viewInfo 함수를 출력하라.
String[] strArr = {"eomjh","LG"};
for (String search : strArr) {
for (InterMember intermem : memArr) {
if (intermem != null && intermem.viewInfo(search) != null) {
System.out.println(intermem.viewInfo(search));
break;
}
}
}
문제2 ▷▷ split을 이용해 leess, samsung, LG를 찾아 viewInfo 함수를 출력하라.
String searchStr = "leess,samsung,LG";
String[] searchArr = searchStr.split("\\,");
for (String search : searchArr) {
for (InterMember intermem : memArr) {
if (intermem != null && intermem.viewInfo(search) != null) {
System.out.println(intermem.viewInfo(search));
break;
}
}
}
-- Java에서는 다중 상속이 불가능하다. (C++은 다중 상속 가능)
-- 클래스에 대한 다중상속은 불가하지만 인터페이스에 대한 다중구현(다중상속)은 가능하다.
-- interface 생성시 다른 interface를 다중상속이 가능하다.
-- 다중상속 받은 interface를 클래스에서 상속 가능하다.
-- interface는 객체 생성은 못 하지만 참조형 타입으로는 사용할 수가 있다.
'수업내용' 카테고리의 다른 글
[Day16][Oracle] Oracle SQL Developer 환경설정 / ALTER / SELECT/ CREATE / INSERT / DELETE / 사용자 계정 생성하기 / Tablespace (0) | 2019.09.10 |
---|---|
[Day14][Java] Exception(예외) / 제품 주문 관리 프로그램 (0) | 2019.09.06 |
[Day12][Java] 다형성 / 추상 메소드 / 추상 클래스 (0) | 2019.09.04 |
[Day11][Java] 캡슐화 / 다형성 (0) | 2019.09.03 |
[Day10][Java] 상속 / 구인구직 관리 프로그램 (0) | 2019.09.02 |