4. 메서드 호출시 파라미터에 전달하는 값(인자값,argument)
인 기본형 vs 참조형
=> call by value vs call by Reference
1) call by value
==> 메서드 호출시 파라미터에 인자값으로 기본형 데이터를
전달 할 수 있다. 이때, 전달받은 메서드에서 값을 수정
할수있음. 원본은 변경 안됨.
2) call by Reference
==> 메서드 호출시 파라미터에 인자값으로 참조형 데이터를
( 클래스, 배열 ) 를 전달 할 수 있다. 이때, 전달받은 메서드
에서 값을 수정할 수 있다. 원본이 변경됨.
이유는 전달되는 인자값이 주소값이기 때문이다.
///////////////////////////////////////////////////////////////////////////////////////////////////////
5. static 키워드 ( 정적 키워드 )
1) 개념: 프로그램 실행과 관련된 키워드임.
( 객체생성인 new 와 무관, 객체생성 전에 결정된다. )
static 으로 지정된 변수 및 메서드, 클래스는 프로그램
실행시 생성이 된다. ( * )
2) 로컬변수 vs 인스턴스 변수 vs static 변수
로컬변수: 메서드 안에서 선언.
메서드 호출 ~ 메서드 종료
인스턴스변수: 메서드 밖에서 선언.
객체생성(new) ~ 객체소멸.
객체소멸시점? heap 에 생성된 인스턴스를 참조못할때
사용방법?
Cat c = new Cat( );
c.변수명;
생성횟수? new 할때 마다 매번 생성된다.(공유안됨)
용도: 객체의 속성 저장 (ex) 고양이 이름,나이
static변수: 메서드 밖에서 선언하고 static 으로 지정.
프로그램실행 ~ 프로그램종료
method area 메모리
프로그램실행시점? run > main 시작
프로그램종료시점? main 종료
==> 객체생성(new) 과 무관하다.( * )
객체생성(new)전에 생성된다.
사용방법? 클래스명.static메서드( );
생성횟수? 한번만 생성된다
용도: 한번만 생성되고 가장 lifecycle 길다.
==> 데이터를 공유할 목적
* 주의할점
- 인스턴스 변수 및 this 키워드 사용불가
==> 아직 인스턴스가 생성 안됨.
- 상속관련에서는 오버라이딩(Overriding) 불가
3) 메서드(인스턴스 메서드, 멤버 메서드) vs static 메서드
메서드(인스턴스 메서드, 멤버 메서드)
- 생성시점? new 할때(객체생성) 생성
- 소멸시점? 객체소멸시 제거
- 사용방법? Cat c = new Cat( );
c.메서드명( );
- 생성횟수? new 할때 마다 매번 생성된다.
(실제로는 공유한다.)
static 메서드
- 생성시점? 프로그램 실행시 생성
- 소멸시점? 프로그램 종료시 제거
==> 객체생성(new) 과 무관하다.( * )
객체생성(new)전에 생성된다.
- 사용방법? 클래스명.static메서드( );
- 사용횟수? 한번만 생성된다.
- 용도: new 없이 사용할 목적이다.
ex) Integer.parseInt("10");
4) 일반 클래스 vs static 클래스
==> static 클래스는 반드시 중첩 클래스에서만 사용이 가능하다.
* 중첩클래스
public class A { // 외부클래스, outer class
// 변수
// 생성자
// 메서드
// 클래스(중첩클래스, nested class, inner class)
static class B {
}// end B
}// end A
==> A 클래스는 반드시 new 해야 된다.
하지만 B 클래스는 프로그램 실행시 자동으로 생성된다.
5) static 블럭 ( * )
==> 문법:
static {
실행문;
}
특징: 프로그램 시작할 때 자동으로 실행된다.
초기화 작업 (ex) DB 및 파일 연동시 )
package exam10_static;
// .java 로 만들어야하지만 여기서도 가능하다는걸 보여주기위해서 작성
class Counter {
int num; // 인스턴스 변수. 매번 생성되기 때문에 누적용으로 사용 불가.
// static 변수. 프로그램 실행시 단 한번만 생성 + lifecycle 가장 길다.
// ==> 공유목적의 누적용
static int count;
public Counter() {
// num++;
count++;
}
public int getNum() { // 인스턴스 메서드, 객체생성(new)시 생성.
// return num;
return count;
}
}// end Counter
public class StaticTest {
public static void main(String[] args) {
// Counter 클래스를 몇번 객체생성했는지 숫자 세기
// static 변수 접근 가능: 클래스명.변수
// new 하기 전에도 접근가능 - Counter.count
System.out.println(Counter.count); // 0, static 변수는 자동초기화됨.
// new 한 후에도 접근가능 - Counter.count
Counter c = new Counter();
System.out.println(c.getNum()); // 1(num) / 1(count)
System.out.println(Counter.count); // 1, static 변수는 자동초기화됨.
Counter c2 = new Counter();
System.out.println(c2.getNum()); // 1(num) / 2(count)
System.out.println(Counter.count); // 2, static 변수는 자동초기화됨.
}
}
package exam10_static2;
// .java 로 만들어야하지만 여기서도 가능하다는걸 보여주기위해서 작성
class Counter {
int num; // 인스턴스 변수. 매번 생성되기 때문에 누적용으로 사용 불가.
static int count;
// static 변수. 프로그램 실행시 단 한번만 생성 + lifecycle 가장 길다.
// ==> 공유목적의 누적용
public Counter() {
// num++;
count++;
}
public int getNum() { // 인스턴스 메서드, 객체생성(new)시 생성.
System.out.println(this); // this 사용가능
return num; // 인스턴스 변수 접근 가능
// return count; // static 변수 접근 가능
}
/*
* stati 메서드 사용시 주의할점
* - 인스턴스 변수 및 this 키워드 사용불가 ==> 아직 인스턴스가 생성 안됨.
*/
public static int getCount() { // static 메서드, 객체생성과 무관, 프로그램 실행시 생성.
// heap 메모리에 생성된 자신의 인스턴스를 참조하는 this 사용불가
// System.out.println(this); // this 사용불가능;
return count; // static 변수 접근 가능
// return num; // 인스턴스 변수 접근 불가능 ==> num 인스턴스 변수는 아직 생성안됨.(new 할떄 생성)
}
}// end Counter
public class StaticTest {
public static void main(String[] args) {
// Counter 클래스를 몇번 객체생성했는지 숫자 세기
// new 전에 static 메서드 호출가능.
// static 메서드 용도: new 없이 메서드 사용하기 위해서.
// 대표적: Integer.parseInt("10");
System.out.println(Counter.getCount()); // 0
Counter c = new Counter();
System.out.println(Counter.getCount()); // 1 ; c.getCount() 가능 (권장안함)
Counter c2 = new Counter();
System.out.println(Counter.getCount()); // 2
}
}
package exam10_static3;
public class Static블럭Test {
// static 블럭
// : 반드시 필요한 선처리 작업을 주로 구현한다.
static {
System.out.println("static 블럭");
}
// instance 블럭
// : 거의 사용 안됨.
{
System.out.println("instance 블럭");
}
public Static블럭Test() {
System.out.println("Static블럭Test 생성자");
}
public static void main(String[] args) {
// 인스턴스 생성 및 new 할때 instance 블럭 이 실행
Static블럭Test t = new Static블럭Test();
}
}
/*
* >>>
1. static 블럭
2. instance 블럭
3. Static블럭Test 생성자
순서대로 실행됨.
*/
'Programming > JAVA(eclipse)' 카테고리의 다른 글
java 8일차 _ 7일차 리뷰 (0) | 2024.03.19 |
---|---|
java 7일차_ 03. import & package (+ UML ) (0) | 2024.03.18 |
java 7일차 _01.메서드 (0) | 2024.03.18 |
java 7일차 _ 6일차정리 (0) | 2024.03.18 |
java 6일차_ 02. 메서드 (0) | 2024.03.15 |