static 메서드와 인스턴스 메서드
static 메서드와 인스턴스 메서드
static이 붙지 않은 것 => 인스턴스 메서드
static이 붙은 것 => static 메서드(클래스 메서드)
iv 사용 여부
인스턴스 메서드
인스턴스 생성 후, '참조변수.메서드이름()'으로 호출
인스턴스 멤버(iv)와 관련된 작업을 하는 메서드
메서드 내에서 인스턴스 변수(iv) 사용 가능
static 메서드(클래스 메서드)
객체생성없이 '클래스이름.메서드이름()'으로 호출
인스턴스 멤버(iv, im)와 관련없는 작업을 하는 메서드
메서드 내에서 인스턴스 변수(iv) 사용 불가
static을 붙어야 할 때, 언제 사용?
속성(멤버 변수) 중에서 공통 속성에 static을 붙임
인스턴스 멤버(iv, im)을 사용하지 않는 메서드에 static을 붙힘
메서드 간 호출과 참조
static 메서드는 인스턴스 변수를 사용할 수 없음
static 메서드는 인스턴스 메서드를 호출할 수 없음
static 메서드는 인스턴스 멤버(iv, im)을 사용할 수 없는지?
->static 메서드 호출 시 객체(iv 묶음)가 없을 수도 있기 때문
오버로딩(Overloading)
과적
한 클래스 안에 같은 이름의 메서드 여러 개 정의 메서드 n : 메서드 이름 1
대표적인 예 println()
오버로딩이 성립하기 위한 조건(3가지 조건이 다 성립되어야함)
1. 메서드 이름이 같아야함
2. 매개변수의 개수 또는 타입이 달라야함
3. 반환 타입은 영향이 없음
ex1) int add(int a, int b){return a+b;}
int add(int x, int y){return x+y;}
오버로딩 X
ex2) int add(int a, int b){return a+b;}
long add(int a, int b){return (long)(a+b);}
오버로딩 X. 중복정의
ex3) long add(int a, long b){return a+b;}
long add(long a, int b){return a+b;}
오버로딩 O
단 add(3,1)이라고 메서드 호출 시 에러발생(ambiguous)
package chapter06;
//(메서드) 오버로딩의 올바른 예
//매개변수는 다르지만 같은 의미의 기능 수행
//※ 메서드 이름의 원칙 : 메서드는 작업을 하는 것이므로 이름을 붙일 때 동사
class AddOverloading{
int add(int a, int b) {
System.out.print("int add(int a, int b) = ");
return a + b;
}
long add(long a, long b) {
System.out.print("long add(long a, longb) = ");
return a + b;
}
//3번 add
long add(int a, long b) {
System.out.print("long add(int a, long b) = ");
return a + b;
}
//4번 add
long add(long a, int b) {
System.out.print("long add(long a, int b) = ");
return a + b;
}
int add(int[] a) { //배열의 모든 요소의 합으로 결과를 돌려줌
System.out.print("int add(int[] a) = ");
int result = 0;
for(int i = 0; i< a.length ;i++) {
result += a[i];
}
return result;
}
}
public class Study16Ex1 {
public static void main(String[] args) {
AddOverloading addOverloading = new AddOverloading();
System.out.println(addOverloading.add(3, 4));
System.out.println(addOverloading.add(3, 4L));
System.out.println(addOverloading.add(3L, 4));
System.out.println(addOverloading.add(3L, 4L));
int[] a = {3,4,5,6};
System.out.println(addOverloading.add(a));
}
}
생성자(Constructor)
생성자(constructor) = iv초기화 메서드
인스턴스가 생성될 때마다 호출되는 '인스턴스* 초기화 메서드'
*인스턴스 = 객체(iv묶음), 인스턴스 초기화 = iv초기화
인스턴스 생성 시 수행할 작업(iv 초기화)에 사용
생성자 규칙
1. 이름이 클래스 이름과 같아야함(생성자 이름 = 클래스 이름)
클래스이름(타입 변수명, 타입 변수명,...){
인스턴스 생성 시 수행될 코드, 주로 인스턴스 변수의 초기화 코드를 작성
}
2. 리턴값이 없음(void를 붙이지 않음. 항상 반환값이 없기 때문)
3. 모든 클래스는 반드시 생성자를 1개 이상이 있어야함
기본 생성자
매개변수가 없는 생성자 -> 클래스이름(){}
생성자가 하나도 없을 때만, 컴파일러가 자동 추가
매개변수가 있는 생성자
코드가 간결해짐
package chapter06;
//생성자가 하나도 없을 때만, 컴파일러가 기본 생성자 자동 추가
class Data_1{
int value;
}
class Data_2{
int vaule;
Data_2(int x){ //매개변수가 있는 생성자
vaule = x;
}
}
public class Study17Ex1 {
public static void main(String[] args) {
Data_1 data_1 = new Data_1();
// Data_2 data_2 = new Data_2(); 기본 생성자 호출-> 기본생성자가 없기 때문에 에러 발생
}
}
// ================================ 수정
package chapter06;
//생성자가 하나도 없을 때만, 컴파일러가 기본 생성자 자동 추가
//클래스를 생성했을 때 기본 생성자를 작성해주는 습관을 가지자
class Data_1{
int value;
Data_1(){} //기본생성자
}
class Data_2{
int vaule;
Data_2(){} //기본생성자
Data_2(int x){ //매개변수가 있는 생성자
vaule = x;
}
}
public class Study17Ex1 {
public static void main(String[] args) {
Data_1 data_1 = new Data_1();
Data_2 data_2 = new Data_2(); //기본 생성자 호출-> 기본생성자가 없기 때문에 에러 발생
}
}
this
this()는 생성자 this는 변수
생성자 this()
생성자에서 다른 생성자를 호출할 때 사용
다른 생성자 호출 시 첫 줄에서만 사용 가능
참조변수 this
인스턴스 자신을 가리키는 참조변수
인스턴스 메서드(생성자 포함)에서 사용가능
지역변수(lv)와 인스턴스 변수(iv)를 구별할 때 사용
Car(String color, String type, int door){
color = color; type = type; door = door;} 는 둘 다 lv임
iv를 사용할 때 참조변수.변수명
참조 변수 this와 생성자 this()
this 인스턴스 자신을 가리키는 참조변수, 인스턴스의 주소가 저장되어 있음
모든 인스턴스 메서드에서 지역변수로 숨겨진 채 존재(선언X 사용 가능)
this(), this(매개변수) 생성자, 같은 클래스의 다른 생성자를 호출할 때 사용. 클래스 이름 대신 this() 사용
package chapter06;
//생성자 this()
class Car{
String color; //색상
String type; //변속기 종류
int door; //차문의 수
Car(String color, String type, int door){
this.color = color;
this.type = type;
this.door = door;
}
Car(){
this("white", "auto", 4);
}
Car(String color){
this(color, "auto", 4);
}
}
public class Study18Ex1 {
public static void main(String[] args) {
}
}
//생성자 this()
class Car{
String color; //색상
String type; //변속기 종류
int door; //차문의 수
Car(String color, String type, int door){
this.color = color;
this.type = type;
this.door = door;
}
Car(){
this("white", "auto", 4);
}
Car(String color){
this(color, "auto", 4);
}
}
package chapter06;
public class Study18Ex2 {
long a, b; //iv의 진짜 이름 this.a, this.b
public Study18Ex2(int a, int b) { //생성자
this.a = a;
this.b = b;
//this.a, this.b => iv. this생략불가
//a, b => lv
//lv와 iv 구분을 위해 this 사용
}
long add() { //인스턴스 메서드
return a + b; //== return this.a + this.b;
}
static long add(long a, long b) { //클래스 메서드(static 메서드) => iv 사용불가, this 사용불가
return a + b;
}
}
초기화
변수의 초기화
지역변수(lv)는 사용 전 수동 초기화 해야함
멤버변수(iv, cv)는 자동 초기화 됨
ex) class Test{
int x; //인스턴스 변수
int y = x; //인스턴스 변수
void method(){
int i; //지역 변수
int j = i; //지역변수를 초기화하지 않고 사용. 에러
}
}
멤버변수(iv, cv)의 초기화
1. 명시적 초기화(=) 선언 시 대입연사자를 이용
class Car{
int door = 4; //기본형 변수의 초기화
Engine e = new Engine(); //참조형 변수의 초기화
}
※참조형 변수를 초기화 하는 방법은 null(기본값) 또는 객체 주소
2. 초기화 블럭(복잡한 초기화)
인스턴스 초기화 블럭 : { } 여러 문장 넣기
클래스 초기화 블럭 : static { }
3. 생성자(iv 초기화, 복잡한 초기화)
Car(String color, String type, int door){ //매개변수가 있는 생성자
this.color = color; this.type = type; this.door = door;}
정리
멤버변수의 초기화 - static{}
1. 명시적 초기화(=)
2. 초기화 블럭 -> {}, static{}
3. 생성자(iv 초기화)
static{} ex)
class StaticBlockTest{
static int[] arr = new int[10]; //명시적 초기화
static{ //클래스 초기화 블럭 - 배열 arr을 난수로 채움
for(int i = 0; i < arr.length; i++){
arr[i] = (int)(Math.random()*10)+1;
}
}
클래스 변수 초기화 시점 : 클래스가 처음(메모리에 올라갈때) 로딩될 때 딱 한 번
인스턴스 변수 초기화 시점 : 인스턴스가 생성될 때 마다
초기화 순서
cv - > iv
자동 -> 간단 -> 복잡
'organize > 자바' 카테고리의 다른 글
Java 11 (0) | 2024.04.23 |
---|---|
Java 10 (0) | 2024.04.22 |
자바 처음부터 다시 시작하기 8 (1) | 2024.04.20 |
자바 처음부터 다시 시작하기 7 (1) | 2024.04.18 |
자바 처음부터 다시 시작하기 6 (0) | 2024.04.17 |