Java - Overloading, 가변인자, 배열, 메소드

|

 

<JAVA의 메모리 구조와 호출스택>

class Test{
	private static int a = 1; //static : new 없어도 호출가능
    private int b = 2; // 멤버변수
    void testMethod(int parameter){ // 매개변수
    	int k = param;   // k: 지역변수
}

<객체지향 - 다형성>
for(1~100){ // 다형성 안썼을때. 일일이 구분해야함.
	if(한국사람)한국person 말하다
    if(미국사람)미국person 말하다
    ...
} 
for(1~100){ // 다형성 썼을때
	person 말하다
}

<지역변수와 매개변수>
void test(int Param){ //매개변수
	int i = param //지역변수
}
void test(String Param){
	String s = param // 'call by value'
}

<변수의 종류 - 실습>
package Week01;

public class PassingValueType {

	public static void main(String[] args) {
		PassingValueType test = new PassingValueType();
		int iValue = 1;
		System.out.println("test01 before:" + iValue); //1
		test.test01(iValue);
		//call by reference로 파라미터를 넘기는 언어에서는 2로 값이 변경된다.
		System.out.println("test01 after:" + iValue); //1
		
		Box box = new Box();
		System.out.println("test02 before:" + box.x); //0
		test.test02(box);
		System.out.println("test02 before:" + box.x); //0
		
		Box box2 = new Box();
		System.out.println("test03 before:" + box2.x); //0
		test.test03(box2);
		System.out.println("test03 before:" + box2.x); //1
	}
	void test03(Box box) {
		box.x = 1;
	}
	void test02(Box box) { // box 매개변수로 받음.
		box = new Box(); //새로이 인스턴스 생성
		box.x = 1;
	}
	void test01(int param) {
		param = 2;
	}
}
class Box{ //new를 통해 인스턴스화하지않으면 사용불가능.
	public int x; //멤버변수. int x는 0임.
}
------------------------------------------
package Week01;

import java.util.Scanner;

public class GradeCalcTest {

	public static void main(String[] args) {
		
		// 국어, 영어, 수학 점수를 받아서 총점, 평균 출력하기.
		int kor, eng, math, tot;
		float avg;
		
		Scanner scanner = new Scanner(System.in);
		System.out.println("국어 = ");
		kor = Integer.parseInt(scanner.nextLine());
		System.out.println("영어 = ");
		eng = Integer.parseInt(scanner.nextLine());
		System.out.println("수학 = ");
		math = Integer.parseInt(scanner.nextLine());
		tot = kor + eng + math;
		avg = tot / 3.0f ;
		System.out.printf("총점 : %d 점 %n,", tot);
		System.out.printf("평균 : %.2f 점 %n,", avg);

	}

}

<기본자료형 배열>
int[] a = new int[3];
a[0] = 1;
a[1] = 2;
a[2] = 3;

<참조자료형 배열>
Dog[] pets = new Dog[3];
pets[0] = new Dog(); //참조자료형이기 때문에 new로 인스턴스를 새로만듬 -> heap 영역에 있는것을 가리킴.
pets[1] = new Dog();
pets[2] = new Dog();

<다차원 배열>
[][]
첫번째 []는 참조영역
두번째 []는 실질적인 위치영역

--------------------------------------
<Overloading>
- 이름은 같지만 파라미터의 개수나 데이터형이 다른 여러개의 메소드를 정의 하는 것.
- 조건 : 같은 클래스, 같은 메소드 이름, 메소드의 파라미터개수가 다르거나 데이터형이 달라야함, 메소드의 리턴형은 가아도 되고 달라도 됨.
- 존재 이유 : 같은 메소드 이름을 사용할수 있게함.

package Week01;

public class OverloadTest {

	public static void main(String[] args) {
		f('c');
		byte i = 2;
		f('i');
		short j = 2;
		f('j');
		f(2);
		f(2L);
		f(2.0);
	}
	private static void f(double d) {}
	
	private static void f(long l) {}
	
	private static void f(int i) {}
	
	private static void f(short j) {}
	
	private static void f(byte i) {}
	
	private static void f(char c) {}

}
---------------------------------------
<배열>
초기화방법
- 자료형[] 배열명 = {값1, 값2, 값3...}
- 배열명 = new 자료형[개수]
- 배열명 = new 자료형[]{값1, 값2, 값3...}

package Week01;

public class VarArgsEx {

	public static void main(String[] args) {
		String[] strArr = {"100", "200", "300"};
		
		System.out.println(concatenate("", "100", "200", "300"));
		System.out.println(concatenate(",", strArr));
		System.out.println(concatenate(",", new String[] {"1", "2", "3"}));
		System.out.println("["+concatenate(",", new String[0]+"]"));
		System.out.println("["+concatenate(",") +"]");

	}

	//가변인자 : 타입...변수명
	//가변인자는 항상 마지막 매개변수
	static String concatenate(String delim, String...args) {
		String result ="";
		for(String str:args) { // args를 배열안에 1개씩 넣어줌.
			result+= str + delim;
		}
		return result;
	}

}
----------------------------------------

package Week01;

public class Dog {
	
	String name;//String의 초기값은 null이다.

	public static void main(String[] args) {
		Dog dog1 = new Dog();
		dog1.bark();
		dog1.name = "Bart";
		
		//Dog배열을 만듭니다. (Dog참조변수)
		Dog[] myDogs = new Dog[3];
		//개를 몇마리 집어 넣습니다.
		myDogs[0] = new Dog();
		myDogs[1] = new Dog();
		myDogs[2] = dog1;
		
		//배열 레퍼런스를 써서 Dog객체에 접근합니다.
		myDogs[0].name = "Fred";
		myDogs[1].name = "Marge";
		
		System.out.println("마지막 개의 이름: ");
		System.out.println(myDogs[2].name);
		
		int x = 0;
		while(x<myDogs.length) {
			myDogs[x].bark();
			x = x +1;
		}

	}

	//메소드는 main 밖에 넣어야함.
	public void bark() {
		this.name = ""; //this 로 초기화함.
		System.out.println(name + "이 왈!하고 짖습니다.");
	}
	public void eat() {
	}
	public void chaseCat() {
	}
}
-------------------------------------

package Week01;

//최대값/최소값 구하기
public class ArrayEx6 {

	public static void main(String[] args) {
		
		int i;
		int[] score = {79, 88, 91, 33, 100, 55, 95};
		int max = score[0]; //배열의 첫번째 값으로 최대값을 초기화한다.
		int min = score[0]; //배열의 첫번째 값으로 최소값을 초기화한다.
		for(i=0; i<score.length;i++) {
			if(max<score[i]) //현재값이 최대값이면 그 값을 최대값으로 update
				max = score[i];
			if(min>score[i]) //현재값이 최소값이면 그 값을 최소값으로 update
				min = score[i];
		}
		
		System.out.println("최대값:" + max);
		System.out.println("최소값:" + min);
		

	}

}
-------------------------------------------

package Week01;

//내림차순 정렬하기
public class ArrayEx10 {

	public static void main(String[] args) {
		
		int[] score = {79, 88, 91, 33, 100, 55, 95};
		for(int i=0; i<score.length; i++) {
			for(int j=0; j<score.length; j++) {
				if(score[i]>score[j]) {
					int temp = score[i];
					score[i]=score[j];
					score[j]=temp;
				}
			}
		}
		for(int k=0;k<score.length; k++) {
			System.out.println(score[k] + " ");
		}

	}

}
------------------------------------------------

package Week01;

public class ClassTest {
	
	private int[] sub; //field
	private float avg; //field
	
	public ClassTest() { //Construct
		sub = new int[4];
		avg = 0.0f;
	}
	
	public void calc() { //메소드
		int tot = 0;
		for(int a = 0; a<sub.length; a++) {
			tot+=sub[a];
		}
		avg = tot/sub.length;
	}
	
	public static class ClassTest_Inner{ // Nested class
		private String[] subname = {"국어", "영어", "수학"}; //field
		
		public String getSubname(int x) { //메소드
			return subname[x];
		}
	}

}
And