IT/JAVA (17.12.18~)

9일차 JAVA(9)

만두토끼 2017. 12. 29. 17:44

1. 매개변수 전달방식

1) call by value

=> 메소드의 매개변수가 value 형인 경우

=> 호출할 때 넘어온 데이터를 변경할 수 없다.

2) call by reference

=> 메소드의 매개변수가 reference 형인 경우

=> 호출할 때 넘어온 데이터를 변경할 수 있다.

3) call by reference 보다는 call by value가 바람직    




2. Method Overloading(중복정의)

=> 하나의 클래스에 동일한 이름의 메소드가 2개 이상 존재하는 경우

=> 매개변수의 개수나 자료형은 달라야 합니다.

=> 유사한 역할(동일한 알고리즘)을 수행하는 메소드의 이름을 동일하게 만들기 위해서 사용




3. 가변인자

=> 매개 변수의 개수가 정해지지 않은 방식

=> 메소드를 호출할 때 자료형의 데이터를 개수에 상관없이 대입 가능

=> 메소드 내부에서는 배열로 처리

=> java 1.5 이상에서 사용 가능 

=> 자로형 ... 매개변수 이름 




4. 생성자(Constructor)

=> 인스턴스를 생성할 때 호출하는 메소드


* 생성자 규칙

1) 이름은 반드시 클래스 이름과 동일

2) 리턴타입은 없음

3) 오버로드 가능 

4) 클래스를 만들면 기본적으로 매개변수가 없는 생성자가 제공되고 생성자를 만들면 제공되는 생성자는 소멸


* 생성자를 만드는 이유

1) 인스턴스가 생성될 때 수행해야 할 작업이 있는 경우

2) 인스턴스 변수 초기화 해야 하는 경우 


* 생성자 이름

1) default constructor 

=> 매개변수가 없는 생성자

2) 복사생성자

=> 자신의 자료형과 동일한 원형의 데이터를 매개변수로 갖는 생성자 


public class Main1 {


public static void main(String[] args) {

//MethodTest에서 생성자를 만들지 않았기 때문에

//객체를 생성하는 방법은 한가지 이고 모든 인스턴스 변수는

//기본값 (0,0.0,flase,null)로 초기화 

MethodTest ob1= new MethodTest();

MethodTest ob2= new MethodTest();

MethodTest ob3= new MethodTest(4);


System.out.println("ob1:"+ob1.getNum());

System.out.println("ob2:"+ob2.getNum());

System.out.println("ob2:"+ob3.getNum());

}


}



public class MethodTest {

//객체에 일련번호를 저장하기 위한 변수

private int num;

private static int autoinc; //계속 사용

//매개변수가 없는 생성자 - Default Construction

// public MethodTest() {

// //num=1;

// }

//

public MethodTest() {

autoinc = autoinc + 1;

num = autoinc;

}

//정수 1개를 받아서 num에 대입하는 생성자

//생성자 오버로딩

//이렇게 생성자를 오버로딩하면 인스턴스를 만드는 방법이 2개가 된다.

public MethodTest(int n) {

num=n;

}

//인스턴스 변수를 만들 때는 private으로 접근지정자를 만들기 때문에

//인스턴스가 접근할 수 없습니다. 

//인스턴스가 인스턴스변수를 접근하기 위한 메소드를 만들어서 사용해야 합니다.

public int getNum() {

return num;

}


public void setNum(int num) {

this.num = num;

}

//매개변수가 정수인 메소드

//매개변수의 데이터를 1 증가시키는 메소드

public void callByValue(int n) {

n=n+1;

}

}





5. 초기화 블럭 

1) static 블럭

static { 

     내용;

}

=> 클래스가 호출될 때 1번만 수행

=> 인스턴스 변수 사용은 안함 


2) instance 초기화 블럭

{

내용;

}

=> 인스턴스가 생성될 때 new 마다 수행 


public class Main3 {


public static void main(String[] args) {

//ClassTest 클래스의 add 메소드 호출

//static이 붙은 메소드는 클래스 이름으로 호출 

int t = ClassTest.add(10, 20);

System.out.println("main결과: "+t);

//ClassTest 클래스의 isAdd 메소드 호출

//인스턴스를 생성

ClassTest ob1 = new ClassTest();

ob1.isAdd(40);

ClassTest ob2 = new ClassTest();

}

}



public class ClassTest {

//class: 사용자 정의 자료형

//사용자가 임의로 메소드와 변수 등을 하나로 묶어둔 

//구성요소: 생성사, 변수, 메소드

//static 변수는 하나만 만들어서 

//클래스와 인스턴스가 공유

private static int st;

//인스턴스가 각각 소유

private int is;

//정수 2개를 매개변수로 받아서 더한 결과를 리턴하는 메소드

public static int add(int a, int b) {

return a+b;

}

//정수 1개를 받아서 is와 더한 결과를 출력하는 메소드 

public void isAdd(int n) {

is = is +n;

System.out.println("결과: "+is);

}

//static 초기화

static {

System.out.println("클래스가 호줄될 때 한 번만 수행");

}

//초기화 

{

System.out.println("인스턴스가 생성될 때 마다 수행 ");

}

}





6. Recursive call (재귀호출) or recursion

=> 메소드가 자기 자신을 다시 호출하는 것

=> 코딩을 간결하게 하기 위해서 사용

=> 메소드의 수행이 중지되기 전에 메소드를 호출하기 때문에 메모리 사용량이 많고 속도도 느릴 수 있다.


ex) 1부터 10까지의 합 -> 10 + 9까지의 합 -> 10+9+8까지의 합 -> 10+9+8+7까지의 합 

    합, 팩토리얼, 피보나치수열, 하노이의 탑 등 


public class Main2


 public static void main(String[] args) {

InitTest it1 = new InitTest(); 

InitTest it2 = new InitTest();

System.out.println();

RecursiveTest r = new RecursiveTest();

System.out.println(r.sum(10));

System.out.println(r.fac(6));

System.out.println(r.fibonacci(8));

}

}



public class InitTest { //얘는 초기화 알아보는 클래스

static {

System.out.println("안녕");

}

{

System.out.println("hello");

}

}



public class RecursiveTest {
//1-n까지의 합을 리턴하는 재귀 메소드
public static int sum(int n) {
if(n==1) {
return 1;
}
else {
return n + sum(n-1);
}
}
//1-n까지의 곱(facorial)을 리턴하는 재귀 메소드
//10까지의 곱 -> 10 곱 하기 9까지의 곱
//1까지의 곱 -> 1
public static int fac(int n) {
if(n==1) {
return 1;
}
else {
return n * fac(n-1);
}
}
//피보나치 
//1. 첫번째와 두번째 항은 무조건 1
//2. 세번째 항부터는 이전 두개 항의 합 
//1,1,2,3,5,8,13,21,34,55,89...
public static int fibonacci(int n) {
if(n==1||n==2) {
return 1;
}
else {
return fibonacci(n-1)+fibonacci(n-2);
}
}
}




7. this 

=> 인스턴스 메소드에 숨겨진 첫번째 매개변수

=> 인스턴스 메소드를 호출할 때 인스턴스에 참조가 this에 전달 

=> static method 에서 사용 x 


this 를 사용하는 경우

=> 인스턴스 메소드에서 지역변수와 인스턴스의 이름이 같을때, 인스턴스 변수를 가리키기 위해서 사용 




8. Garbage Collection 

=> heap 메모리를 자동으로 정리해주는 자바 프로그램

=> 일정시간이 지나거나 메모리가 부족하면 자동호출 

=> heap 의 영역 중 가리키고 있는 것이 없으면 정리




9. Package 

=> 관련있는 클래스의 집합 - 디렉토리와 유사

=> java에서는 jar 이라고 하는 압축 형식으로 제공 

=> 패키지 안에 클래스가 만들어지면 클래스 이름 앞에 패키지 이름이 붙습니다. 

=> 패키지 이름은 소문자 

=> 패키지 이름은 도메인을 역순으로 쓰고 프로젝트 이름을 기재 




10. Import 

=> 패키지 이름을 생략하고 클래스를 사용하기 위한 개념 

1) import 패키지이름.*;

2) import 패키지이름.클래스이름;


java.util

java.lang 

'IT > JAVA (17.12.18~)' 카테고리의 다른 글

11일차 JAVA(11)  (0) 2018.01.03
10일차 JAVA(10)  (0) 2018.01.02
8일차 JAVA(8)  (0) 2017.12.28
7일차 JAVA(7)  (0) 2017.12.27
6일차 JAVA(6)  (0) 2017.12.26