관리 메뉴

거니의 velog

230829_스레드 1 본문

대덕인재개발원/대덕인재개발원_자바기반 애플리케이션

230829_스레드 1

Unlimited00 2023. 8. 29. 15:43

[ArgsTest.java]

package kr.or.ddit.basic;

public class ArgsTest {

	/*
	 * 접근제한자 반환값 메서드명( 매개변수들... ) {
	 * 		
	 * }
	 */
	
//	public static void test(int a, int b) {
//		
//	}
	
	// 매개변수로 받은 정수들의 합계를 구하는 메서드를 작성하시오.
	// (단, 이 정수들의 개수는 상황에 따라 다를 수 있다.)
	
	// 배열 이용하기
	public int sumArr(int[] data) {
		int sum = 0; // 합계 저장 변수 초기화
		
		for(int i=0; i<data.length; i++) {
			sum += data[i];
		}
		
		return sum;
	}
	
	// 가변형 인수 ==> 메서드를 호출할 때 사용되는 인수의 개수가 호출할 때마다 다를 때 사용한다.
	// - 가변형 인수는 구현한 메서드 안에서는 배열로 처리된다.
	// - 가변형 인수는 한가지 자료형만 사용할 수 있다.
	
	public int sumArg(int...data) {
		int sum = 0;
		
		for(int i=0; i<data.length; i++) {
			sum += data[i];
		}
		
		return sum;
	}
	
	// 가변형 인수와 일반적인 인수를 같이 사용할 경우에는 가변형 인수를 제일 뒤 쪽에 배치해야 한다.
	public String sumArg2(String name, int...data) {
		int sum = 0;
		
		for(int i=0; i<data.length; i++) {
			sum += data[i];
		}
		
		return name + "씨의 점수 ==> " + sum + "점";
	}
	
	public static void main(String[] args) {
		
//		test(10, 20); // 인수 개수 = 매개변수 개수
		
		ArgsTest test = new ArgsTest();
		
		int[] nums = {100, 200, 300, 400}; // 배열 선언과 초기화를 동시에 할 때
//		int[] nums;
//		nums = {100, 200, 300, 400}; // 배열 선언과 초기화 분리할 수 없음.
		
		// 배열 선언과 초기화를 동시에 할 수도 있고 따로 할 수도 있다.
//		int[] nums2 = new int[]{100, 200, 300, 400};
		int[] nums2; // 배열 선언
		nums2 = new int[]{100, 200, 300, 400}; // 배열 초기화
		
		System.out.println(test.sumArr(nums)); // 1000
//		System.out.println(test.sumArr( {1, 2, 3, 4, 5} )); // 배열 초기화 불가능.
		System.out.println(test.sumArr( new int[]{1, 2, 3, 4, 5} )); // 15
		
		System.out.println("--------------------------------------");
		
		System.out.println(test.sumArg(100, 200, 300, 400)); // 1000
		System.out.println(test.sumArg(1, 2, 3, 4, 5)); // 15
		
		System.out.println("--------------------------------------");
		
		System.out.println(test.sumArg2("홍길동", 10,20,30,40)); // 홍길동씨의 점수 ==> 100점
		
	}

}


[GenericTest.java]

package kr.or.ddit.basic;

// 제네릭 나오기 전에 사용한 방식
class NonGeneric {
	
	private Object value;

	public Object getValue() {
		return value;
	}

	public void setValue(Object value) {
		this.value = value;
	}
	
}

/*
 * 제네릭 클래스 작성 방법
 * 
 * 형식 )
 * 
 * 		class 클래스명<제네릭타입글자> {
 * 			제네릭타입글자 변수명; // 변수 선언에 제네릭을 사용할 경우
 * 			...
 * 			
 * 			제네릭타입글자 메서드명( 매개변수들... ) { // 메서드의 반환값에 제네릭을 사용할 경우
 * 				~~~
 * 				return 값;
 * 			}
 * 
 * 			반환값타입 메서드명(제네릭타입글자 변수명, ...) { // 메서드의 매개변수에 제네릭을 사용할 경우
 * 				~~~
 * 				return 값;
 * 			}
 * 		}
 * 
 * 
 */

// MyGeneric<String> mg1 = new MyGeneric<String>();
// MyGeneric<Integer> mg2 = new MyGeneric<>();
class MyGeneric<T> {
	
	private T value;
	
	public void setValue(T value) {
		this.value = value;
	}
	
	public T getValue() {
		return value;
	}
	
}

public class GenericTest {
	
	public static void main(String[] args) {
		
		NonGeneric ng1 = new NonGeneric();
		ng1.setValue("가나다라");
		
		NonGeneric ng2 = new NonGeneric();
		ng2.setValue(100);
		
		String rtnNg1 = (String) ng1.getValue();
		System.out.println("문자열 반환값 rtnNg1 => " + rtnNg1); // 문자열 반환값 rtnNg1 => 가나다라
		
		int rtnNg2 = (int) ng2.getValue();
		System.out.println("정수 반환값 rtnNg2 => " + rtnNg2); // 정수 반환값 rtnNg2 => 100
		System.out.println();
		
		System.out.println("---------------------------------");
		
		MyGeneric<String> mg1 = new MyGeneric<String>();
		mg1.setValue("우리나라");
//		mg1.setValue(1000); // 오류가 남. 제네릭에 설정한 데이터 타입(String)이 아니기 때문.
		
		MyGeneric<Integer> mg2 = new MyGeneric<>();
		mg2.setValue(500);
//		mg2.setValue("대한민국"); // 오류가 남. 제네릭에 설정한 데이터 타입(Integer)이 아니기 때문.
		
		// 반환값 받아올 때 형변환이 필요 없다.
		String rtnMg1 = mg1.getValue();
		System.out.println("제네릭 문자열 반환값 rtnMg1 => " + rtnMg1); // 제네릭 문자열 반환값 rtnMg1 => 우리나라
		
		int rtnMg2 = mg2.getValue();
		System.out.println("제네릭 정수 반환값 rtnMg2 => " + rtnMg2); // 제네릭 정수 반환값 rtnMg2 => 500
		System.out.println();
		
		System.out.println("---------------------------------");
		
		// ----------------------------------------------------------
		
//		String temp = (String) ng2.getValue();
//		System.out.println("temp = " + temp);
		// Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
		// 원 데이터는 Integer인데 Object로 감싸서 가져옴.
		// 어떤 변수에 저장할 때는 Object가 가장 큰 조상이므로 변수 타입에 맞게 다운 캐스팅할 수 있다. 문법적으로는 전혀 문제가 없다.
		// 실행할 때 문제가 발생. Object 껍데기 벗기고 그 안에 들어 있는 데이터가 Integer 데이터. 이를 String으로 바꿀 수 없는 것.
		// 예전에는 이런 식의 오류가 많았다.
		// 컴파일 에러는 찾기 쉬우나, 논리적 오류는 찾기 어려운 이유.
		
	}

}