λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
πŸ’»/JAVA

[Java] 9일차 : 클래슀(class)와 객체(Object) λ©”μ†Œλ“œ(2)

by λ”°κΆˆ 2024. 2. 26.

 

λ©”μ†Œλ“œ(Method)

λ©”μ†Œλ“œμ˜ 인수 전달

λ©”μ†Œλ“œ μ‚¬μ΄μ˜ 자료 κ΅ν™˜μ€ `맀개 λ³€μˆ˜`(인수)에 μ˜ν•΄ 이루어진닀.

ν˜•μ‹ 맀개 λ³€μˆ˜(formal paramter,κ°€μΈμˆ˜) : λ©”μ†Œλ“œκ°€ ν˜ΈμΆœλ˜λŠ” μͺ½μ— ν˜ΈμΆœν•œ λ©”μ†Œλ“œμ—μ„œ λ„˜κ²¨λ°›λŠ” 값을 κΈ°μ–΅

μ‹€ 맀개 λ³€μˆ˜(actual parameter, μ‹€μΈμˆ˜) : λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν•  λ•Œ 호좜 λ°›λŠ” ν•¨μˆ˜μ—κ²Œ λ„˜κ²¨μ£ΌλŠ” 값을 의미

 

Call by Value(값에 μ˜ν•œ μΆ”μΆœ)

 

κΈ°λ³Έ 자료 ν˜•μœΌλ‘œ 인수 전달

κ°’(value)을 호좜된 λ©”μ†Œλ“œμ˜ μΈμˆ˜μ— 볡사 ν•˜λ©° λ³΅μ‚¬λœ 값은 λ©”μ†Œλ“œ λ‚΄μ—μ„œ local value νŠΉμ§•μ„ κ°–μŒ

호좜 λ©”μ†Œλ“œμ™€ 호좜된 λ©”μ†Œλ“œκ°€ 각각의 맀개 λ³€μˆ˜μ— λŒ€ν•œ κΈ°μ–΅ 곡간을 λ”°λ‘œ ν™•λ³΄ν•˜μ—¬ 각각 λ…λ¦½μ μœΌλ‘œ μ‚¬μš©λ˜λ©°, 

λ©”μ†Œλ“œμ˜ ν˜•μ‹ λ§€κ°œλ³€μˆ˜ 값이 λ³€κ²½λ˜μ–΄λ„ ν˜ΈμΆœν•œ λ©”μ†Œλ“œμ˜ μ‹€ λ§€κ°œλ³€μˆ˜ 값은 λ³€κ²½λ˜μ§€ μ•ŠλŠ”λ‹€.

 

Call By Reference (참쑰에 μ˜ν•œ 호좜)

 

레퍼런슀 ν˜•μœΌλ‘œ 인수λ₯Ό 전달(λ°°μ—΄, 클래슀 μ°Έμ‘°ν˜•, μΈμŠ€ν„΄μŠ€ μ°Έμ‘°ν˜•λ“±)

호좜된 λ©”μŠ€λ“œλ‘œ κ°’(value)λ₯Ό 전달 ν•˜λŠ” 것이 μ•„λ‹ˆλΌ μ°Έμ‘° μœ„μΉ˜λ₯Ό 전달 

 

package ch06.unit03;


//νŒŒλΌλ§€ν„° 전달 방법 
public class Ex11 {

	public static void main(String[] args) {
		Demo1 d = new Demo1(); // dλŠ” μ£Όμ†Œλ₯Ό κ°–λŠ”λ‹€ xκ°€ μ €μž₯된 곳의 μ£Όμ†Œ
		int[] aa = new int[] { 1, 2, 3 }; // aa:μ£Όμ†Œ
		int a = 5;

		d.sub1(a);
		System.out.println("sub1() ν˜ΈμΆœν›„ a : " + a);

		d.sbu2(d);
		System.out.println("sub2() ν˜ΈμΆœν›„ d.x : " + d.x); // 20

		d.sbu3(aa);
		System.out.println("sub3() ν˜ΈμΆœν›„ aa[1] : " + aa[1]);

		Demo1 d2 = new Demo1();
		Demo1 d3 = new Demo1();

		d2.sbu4();
		System.out.println(d2.y + ":" + d3.y);

	}

}

class Demo1 {
	int x = 10;
	int y;

	// call by value : 값을 λ„˜κ²¨ λ°›μŒ
	public void sub1(int a) {
		a += 10; // 15

	}

	public void sbu2(Demo1 obj) {
		obj.x += 10;
	}

	public void sbu3(int[] a) {
		a[1] += 10;
	}

	public void sbu4() {

	
		y = 100; // sub4() λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν•œ 객체것

	}
}

 

 

 

 

μž¬κ·€ν˜ΈμΆœ

" λ©”μ†Œλ“œ λ‚΄μ—μ„œ λ©”μ†Œλ“œ 자기 μžμ‹ μ„ ν˜ΈμΆœν•˜λŠ” 방식을 μž¬κ·€ 호좜(recursive call)이라 ν•˜κ³ , μ΄λŸ¬ν•œ νŠΉμ§•μ„ μž¬κ·€(recursion, λ˜λΆ€λ¦„)라 ν•œλ‹€."

μ½”λ“œκ°€ κ°„κ²°ν•˜κ³  였λ₯˜ μˆ˜μ •μ΄ μš©μ΄ν•˜μ§€λ§Œ, 처리 속도가 느렀 반볡문 보닀 λΉ„νš¨μœ¨μ .

ν•˜λ‚˜ μ΄μƒμ˜ μ’…λ£Œ 쑰건을 μ‚¬μš©ν•˜μ—¬ μž¬κ·€ ν˜ΈμΆœμ„ μ’…λ£Œ ν•΄μ•Ό ν•œλ‹€. μž¬κ·€ν˜ΈμΆœμ€ 원 문제λ₯Ό λΆ€λΆ„ 문제둜 μ€„μ—¬κ°€λ©΄μ„œ μ’…λ£Œ 쑰건이 될 λ•Œ κΉŒμ§€ λ°˜λ³΅ν•œλ‹€.

 

package ch06.unit03;

//μž¬κ·€ν˜ΈμΆœ : 이전 μƒνƒœμ˜ 값은 Stack에 보관 
//μž¬κ·€ν˜ΈμΆœμ€ μ’…λ£Œ 쑰건을 μ£Όμ§€ μ•ŠμœΌλ©΄ StackOverflowError λ°œμƒ 
public class Ex12 {

	public static void main(String[] args) {
		Demo2 obj = new Demo2();
		obj.write(5);
		System.out.println();

	}
}

class Demo2 {
	public void write(int n) {
		if (n > 1) {
			write(n - 1);
		}
		System.out.println(n + " ");
	}
}

 

 

 

package ch06.unit03;

public class Ex13 {

	public static void main(String[] args) {
		Demo3 obj = new Demo3();
		int s = obj.sum(10);
		System.out.println(s);

	}

}

class Demo3 {
	public int sum(int n) {
		/*
		 * if(n>1) { 
		 * return n + sum (n-1); 
		 * }
		 * return n;
		 */
		
		return (n>1) ? sum(n-1)+ n:1;
	}
}

 

 

package ch06.unit03;

public class Ex14 {

	public static void main(String[] args) {
		Demo4 obj = new Demo4();
		obj.print(3);

	}

}
class Demo4{
	public void print (int n) {
		System.out.println("start :" +n);
		
		if(n>1) {
			print(n-1);
			print(n-1);
		}
		System.out.println("end : "+n);
	}
}

 

 

 

package ch06.unit03;

public class Ex15 {

	public static void main(String[] args) {
		Demo5 obj = new Demo5();

		double s = obj.pow(2, 10);
		System.out.println(s);

		s = obj.pow(2, -2);
		System.out.println(s);

	}

}

class Demo5 {
	public double pow(int x, int y) {
		if (y >= 0) {
			return y == 0 ? 1 : x * pow(x, y - 1);
		} else {
			return 1.0 / x * pow(x, y + 1);

		}
	}
	public double pow2(int x,int y) {
		return y == 0 ? 1 : x * pow2(x, y - 1);
	}


}

 

ν”Όλ³΄λ‚˜μΉ˜ μˆ˜μ—΄, μž¬κ·€ν•¨μˆ˜λ‘œ κ΅¬ν•˜κΈ°
package ch06.unit03;

public class Ex16 {
	//ν”Όλ³΄λ‚˜μΉ˜ μˆ˜μ—΄ : 0  1  1  2 3 5 8 13 21 ....
 	public static int fibonacci(int n) {
		return n<2 ? n : fibonacci(n-1)+fibonacci(n-2);
	}
	
	public static void main(String [] args) {
		int n;
		for(int i=0; i<10; i++) {
			n = fibonacci(i);
			System.out.println(n+" ");
		}
		System.out.println();
	}

}

 

 

 

λ©”μ†Œλ“œ μ˜€λ²„λ‘œλ”©

ν•œ 클래슀 λ‚΄μ—μ„œ 이름이 같은 λ©”μ†Œλ“œλ₯Ό μ •μ˜ ν•˜λŠ” κ²ƒμœΌλ‘œ λ‹€μŒκ³Ό 같은 쑰건이 성립해야 ν•œλ‹€.

λ§€κ°œλ³€μˆ˜ νƒ€μž…μ΄ λ‹€λ₯΄κ±°λ‚˜, λ§€κ°œλ³€μˆ˜μ˜ κ°œμˆ˜κ°€ 달라야 ν•œλ‹€.

μ˜€λ²„λ‘œλ”© 된 λ©”μ†Œλ“œλŠ” λ§€κ°œλ³€μˆ˜μ— μ˜ν•΄μ„œλ§Œ κ΅¬λΆ„λœλ‹€. λ§€κ°œλ³€μˆ˜λŠ” κ°™μœΌλ‚˜ λ°˜ν™˜ν˜•μ΄ λ‹€λ₯Ό κ²½μš°μ—λŠ” 컴파일 였λ₯˜κ°€ λ°œμƒν•œλ‹€. λ©”μ†Œλ“œ 리턴 νƒ€μž…μ€ μ˜€λ²„λ‘œλ”©μ„ κ΅¬ν˜„ν•˜λŠ”λ° μ•„λ¬΄λŸ° 영ν–₯을 μ£Όμ§€ λͺ»ν•¨.

λ§€κ°œλ³€μˆ˜μ˜ κ°œμˆ˜λ‚˜ νƒ€μž…μ΄ λ‹€λ₯΄μ§€λ§Œ, 좜λ ₯ν•˜λŠ” κΈ°λŠ₯이 λ™μΌν•œ System.out.println()κ°€ κ°€μž₯ λŒ€ν‘œμ μ΄λ‹€.

λ©”μ†Œλ“œ 이름 + νŒŒλΌλ―Έν„° λ³€μˆ˜μ˜ 수 + νƒ€μž… + μˆœμ„œλ₯Ό λ¬Άμ–΄μ„œ λ©”μ†Œλ“œ μ‹œκ·Έλ‹ˆμ²˜λΌ 뢀름. μƒμ„±μžλ„ 쀑볡 μ •μ˜ κ°€λŠ₯.

 

 

 

 

 

package ch06.unit03;

public class Ex17 {

	public static void main(String[] args) {
		Demo7 obj = new Demo7();

		byte a = 10; // λ§€κ°œλ³€μˆ˜μ˜ μžλ£Œν˜•μ΄ κ°™κ±°λ‚˜ 큰것쀑 κ°€μž₯ 적은것 좜λ ₯
		obj.disp(a);

		int b = 10; // int
		obj.disp(b);

		long c = 10; // float
		obj.disp(c);

		// double d = 10;
		// obj.disp(d); // 컴였λ₯˜
	}

}

// overloading :  λ©”μ†Œλ“œ 쀑볡 μ •μ˜

class Demo7 {
	public void disp() {
		System.out.println("인자 μ—†λŠ” λ©”μ†Œλ“œ");
	}

	// μ˜€λ²„λ‘œλ”©μ€ 리턴 νƒ€μž…μœΌλ‘œ κ΅¬λΆ„ν•˜μ§€ μ•Šκ³  λ§€κ°œλ³€μˆ˜μ˜ κ°œμˆ˜κ°€ λ‹€λ₯΄κ±°λ‚˜
	// λ§€κ°œλ³€μˆ˜μ˜ νƒ€μž…μ΄ 달라야 ν•œλ‹€
	/*
	 * public int disp() { // 컴파일 였λ₯˜ return 1; }
	 */

	public void disp(short n) {
		System.out.println("short : " + n);

	}

	public void disp(int n) {
		System.out.println("int : " + n);
	}

	public void disp(float n) {
		System.out.println("float : " + n);
	}

}

 

 

 

바인딩(binding)

 

속성과 개체 λ˜λŠ” μ—°μ‚°κ³Ό 기호λ₯Ό μ—°κ΄€μ‹œν‚€λŠ” 것, λ³€μˆ˜μ˜ 데이터 νƒ€μž…μ΄ 무엇인지λ₯Ό μ •ν•˜κ±°λ‚˜ λ©”μ†Œλ“œμ˜ 호좜과 μ‹€μ œ λ©”μ†Œλ“œλ₯Ό μ—°κ²°ν•˜λŠ” 방법 λ“± ν”„λ‘œκ·Έλž¨μ˜ ꡬ성 μš”μ†Œμ˜ 성격을 κ²°μ •ν•˜λŠ”κ²ƒμ΄λ‹€. 

 

정적 바인딩(static binding) 동적 바인딩(dynamic binding)
컴파일 μ‹œκ°„μ— 성격이 κ²°μ • λ˜λŠ” 것  μ‹€ν–‰μ‹œκ°„μ— 성격이 κ²°μ •λ˜λŠ” 것
컴파일 μ‹œ νƒ€μž…μ— λŒ€ν•œ 정보가 κ²°μ •λ˜λ―€λ‘œ 속도가 λΉ λ₯΄λ‹€ 싀행도쀑 성격이 κ²°μ •λ˜λ―€λ‘œ μœ μ—°μ„±μ„ κ°–μ§€λ§Œ 속도가 느리고, λ³€μˆ˜μ˜ μ˜ˆμƒμΉ˜ λͺ»ν•œ νƒ€μž…μœΌλ‘œ μ•ˆμ •μ„±μ΄ μ €ν•˜λ¨

 

β–Ά λ©”μ†Œλ“œμ˜ 바인딩 : λ©”μ†Œλ“œμ— λŒ€ν•œ ν˜ΈμΆœμ„ λ©”μ†Œλ“œ λͺΈμ²΄μ™€ μ—°κ²° ν•˜λŠ” 것.

 

정적 바인딩 동적 바인딩
객체의 νƒ€μž…μ΄ μ»΄νŒŒμΌλŸ¬μ— μ˜ν•΄ 컴파일 μ‹œμ— κ²°μ • 객체 νƒ€μž…μ΄ 런 νƒ€μž„ 쀑에 κ²°μ •
컴파일 μ‹œ ν˜ΈμΆœν•  λ©”μ†Œλ“œκ°€ κ²°μ • ν”„λ‘œκ·Έλž¨ μ‹€ν–‰ 도쀑 λ©”μ†Œλ“œκ°€ 호좜될 λ•Œ κ·Έ λ©”λͺ¨λ¦¬μ˜ μ°Έμ‘°λ₯Ό μ•Œμ•„λ‚΄λŠ” 것
λ©”μ†Œλ“œ μ˜€λ²„λ‘œλ”©(overloading) λ©”μ†Œλ“œ μ˜€λ²„λΌμ΄λ”©(overriding)
private,final,static λ©”μ†Œλ“œλŠ” λͺ¨λ‘ 정적 바인딩  

 

 

package ch06.unit03;
// μ˜€λ²„λ‘œλ”© 
public class Ex18 {

	public static void main(String[] args) {
		Demo8 obj = new Demo8 ();
		
			short a = 10;
			int b = 20;
			long c = 30;
			
			
			obj.disp(a); // int
			obj.disp(b); // int
			obj.disp(c); // Long 
		
			Byte x = 5;
			obj.disp(x); // int
			
			Short y = 7;
			obj.disp(y); // Short 
	}

}

/*
 * Wrapper class : κΈ°λ³Έν˜• 데이터λ₯Ό 객체 λ‹¨μœ„λ‘œ 처리 ν• μˆ˜ μžˆλ„λ‘ 클래슀λ₯Ό 제곡
 *  Byte, Short, Integer, Long, Float, Double, Character, Boolean λ“±  
 */

class Demo8 {
	public void disp(Short n) {
		System.out.println("Short : " + n);
	}

	public void disp(int n) {
		System.out.println("int : " + n);
	}

	public void disp(Float n) {
		System.out.println("Float : " + n);
	}

	public void disp(Long n) {
		System.out.println("Long : " + n);
	}
}

 

λΉ„μ •ν˜„ 인자

λΉ„μ •ν˜• 인자(Variable-Length Arguments)λŠ” 같은 νƒ€μž…μ˜ λ§€κ°œλ³€μˆ˜λ₯Ό κ°€λ³€μ μœΌλ‘œ μ„ μ–Έ ν• λ•Œ μ‚¬μš©ν•œλ‹€. λ©”μ†Œλ“œλ₯Ό μ •μ˜ν•  λ•Œ λ§€κ°œλ³€μˆ˜ νƒ€μž… λ‹€μŒμ— μƒλž΅ λΆ€ν˜ΈμΈ(eliipsis)인 '...'을 λΆ™μ—¬ μ„ μ–Έν•œλ‹€.

 

 

package ch06.unit03;

public class Ex19 {

	public static void main(String[] args) {
		// λΉ„μ •ν˜•μΈμž 
		Demo9 obj = new Demo9();
		
		int s = obj.sum(1,3,5,7,9);
		System.out.println(s);
		

	}

}

class Demo9 {
	public int sum(int...args) {
		int s = 0;
		
		for(int n : args) {
			s+=n;
		}
		return s;
		
	}
}