본문 바로가기

수업내용

[Day13][Java] Overloading(오버로딩) / final(예약어) / interface(인터페이스)

Ⅰ. 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로 지정된 methodoverride가 불가하다.

 

 

 

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는 객체 생성은 못 하지만 참조형 타입으로는 사용할 수가 있다.