본문 바로가기
JAVA

JAVA | 변수와 메서드, 오버로딩, 생성자

by 개발송이 2022. 1. 23.

 

 

3. 변수와 메서드

 

3.11 클래스 메서드(static메서드)와 인스턴스 메서드

 

인스턴스 메서드

-인스턴스 생성 후, '참조변수.메서드이름()'으로 호출

-인스턴스 멤버(iv, im)와 관련된 작업을 하는 메서드

-메서드 내에서 인스턴스 변수(iv) 사용가능

 

static 메서드(클래스 메서드)

-객체생성없이 '클래스이름.메서드이름()'으로 호출

-인스턴스 멤버(iv, im)와 관련없는 작업을 하는 메서드

-메서드 내에서 인스턴스 변수(iv) 사용불가

 

class MyMath2 {
	long a, b;
    
    long add() {   //인스턴스 메서드
    	return a + b;
    }
    
    static long add(long a, long b) { //클래스 메서드(static)
    	return a + b;
    }
 }

iv의 사용여부에 따라 나뉨

 

1.클래스를 설계할 때, 멤버변수 중 모든 인스턴스에 공통으로 사용하는 것에 static을 붙인다.

2.클래스 변수(static변수)는 인스턴스를 생성하지 않아도 사용할 수 있다.

3.클래스 메서드(static메서드)는 인스턴스 변수를 사용할 수 없다.

4.메서드 내에서 인스턴스 변수를 사용하지 않는다면, static을 붙이는 것을 고려한다.

0클래스의 멤버변수 중 모든 인스턴스에 공통된 값을 유지해야하는 것이 있는지 살펴보고, 있으면 static을 붙여준다.

-작성한 메서드 중에서 인스턴스 변수나 인스턴스 메서드를 사용하지 않는 메서드에 static을 붙일 것을 고려한다.

 

 

3.12 클래스 멤버와 인스턴스 멤버간의 참조와 호출

 

sttic메서드는 인스턴스 메서드를 호출할 수 없다.

class TestClass{
    void instanceMethod() {}  //인스턴스메서드
    static void staticMethod() {}  //static메서드
    
    void instanceMethod2 () {  //인스턴스메서드
    	 instanceMethod();     //다른 인스턴스메서드를 호출한다.
         staticMethod();       //static메서드를 호출한다. 항상가능!
    }
    
    static void staticMethod2() {  //static메서드
    	instnaceMEthod();      //에러발생, 인스턴스 메서드를 호출할 수 없다.
                               // iv로 작업하려면 객체가 필요함
        staticMethod();       //static메서드는 호출할 수 있다.
    }
}

static 메서드는 인스턴스변수를 사용할 수 없다.

class TestClass{
	void iv;  //인스턴스변수. 객체생성 후 사용가능
    static int cv;  //클래스변수. 언제나 사용가능
    
    void instanceMethod2 () {  //인스턴스메서드. 객체생성 후 호출가능
    	 System.out.println(iv);  //인스턴스 변수를 사용할 수 있다.
         System.out.println(cv);      //클래스변수를 사용할 수 있다.
    }
    
    static void staticMethod2() {  //static메서드
    	System.out.println(iv);      //에러발생, 인스턴스 변수를 사용할 수 없다!!
                                    // iv로 작업하려면 객체가 필요함
        System.out.println(cv);  //클래스 변수는 사용할 수 있다.
        }
}

 

>속성(멤버변수) 중에서 공통 속성에 static을 붙인다.

개별속성->인스턴스변수 iv -> int number;

공통속성->클래스변수 cv -> static int width = 100;

>인스턴스 멤버(iv, im)을 사용하지 않는 메서드에 static을 붙인다.

 

Q.static메서드는 static메서드 호출가능?

A.네

Q.static 메서드는 인스턴스 변수 사용가능?

A.놉

Q.static 메서드는 인스턴스 메서드 호출가능?

A.놉

Q.왜? static메서드는 인스턴스 멤버를 쓸 수 없나?

A.static메서드 호출시 객체(iv묶음)가 없을 수도 있어서

 

 

 

4. 오버로딩

 

메서드:메서드이름 = n:1

한 클래스 내에 같은 이름의 메서드를 여러 개 정의하는 것

매개변수의 개수 또는 타입이 다르면 같은 이름을 사용해서 메서드를 정의할 수 있음

 

4.2 오버로딩의 조건

1.메서드 이름이 같아야 한다.

2.매개변수의 개수 또는 타입이 달라야 한다.

3,반환 타입은 오버로딩을 구현하는데 아무런 영향을 주지 못한다.

(리턴타입만 다른거는 안됨)

 

5. 생성자 Constructor

5.1 생성자란

생성자는 인스턴스가 생성될 때 호출되는 '인스턴스 초기화 메서드'이다,

iv초기화를 편리하게 하려고 하는것.

메서드와 유사ㅏ하지만 리턴값이 없음.

 

생성자의 조건

1.생성자의 이름은 클래스의 이름과 같아야 한다.

2.생성자는 리턴 값이 없다.(대입문이라 반환값이 없음)(void안붙임)

3.모든 클래스는 반드시 생성자를 가져야 한다.

클래스이름( 타입 변수명, ''') {
	//인스턴스 생성 시 수행될 코드 주로 인스턴스 변수의 초기화 코드를 적음
}

class Card { //클래스이름=생성자이름
    Card() {  } //매개변수 없는 생성자
    
    Card(String k, int num) { }  //매개변수 있는 생성자
}

 

Card c = new Card(); //인스턴스 생성 및 생성자 호출

(연산자 new가 인스턴스를 생성하는 것이지 생성자가 인스턴스를 생성하는 것이 아님.)

수행과정

1. 연산자 new에 의해서 메모리에 Card클래스의 인스턴스가 생성된다.

2. 생성자 Card()가 호출되어 수행된다.

3. 연산자 new의 결과로, 생성된 Card인스턴스의 주소가 반환되어 참조변수 c에 저장된다.

 

Time t = new Time();
t.hour = 12;
t.minute = 34;
t.second = 56;

//인스턴스 초기화 메서드라는 말이 iv즉 변수를 초기화해준다는 거임
//초기화라는게 객체만들고 변수에 내가 원하는 값을 넣는다는 거임

Time t = new Time(12,34,56);

 

5.2 기본생성자

-매개변수 없는 생성자

-클래스 안에 생성자가 하나도 없을때만, 컴파일러가 자동추가됨

클래스이름() { } //기본생성자
Card() { } //card클래스의 기본 생성자

컴파일러가 자동으로 추가해주는 기본 생성자는 이와 같이 매개변수도 없고 내용도 없음.

class Data1 {
    int value;  //생성자가 하나도 없어서 기본생성자가 자동으로 생김
}

class Data2 {
    int value;
    
    Data2(int x) {  //매개변수가 있는 생성자
        value = x;
    }
}

class ConstructorTest {
    Public static void main(String[] args) {
        Data1 d1 = new Data1();
        Data2 d2 = new Data2(); //에러
}  //기본생성자를 호출했는데 매개변수있는 생성자뿐임. new Data(10); 혹은 Data2(); 추가 해야 함

 

5.3 매개변수가 있는 생성자

생성자도 메서드처럼 매개변수를 선언하여 호출 시 값을 넘겨받아서 인스턴스의 초기화 작업에 사용 가능.

class Car {
	String color;
	String gearType;
	int door;
	
	Car () {};
	
	Car (String c, String g, int d){
		color = c;
		gearType = g;
		door = d;
	}
}
public class CarTest {

	public static void main(String[] args) {
		Car c1 = new Car();
		c1.color = "white";
		c1.gearType = "auto";
		c1.door = 4;
		
		Car c2 = new Car("White", "auto", 4);
		
		System.out.println(c1.color + c1.gearType + c1.door);
		System.out.println(c2.color + c2.gearType + c2.door);
	}

}

 

5.4 생성자에서 다른 생성자 호출하기 - this(), this

-생성자의 이름으로 클래스이름 대신 this를 사용한다.

-한 생성자에서 다른 생성자를 호출할 떄는 반드시 첫 줄에서만 호출이 가능하다.

class Car {
	String color;
	String gearType;
	int door;
	
	Car () {  //생성자는 첫번째 줄에서 생성
		this("white", "auto", 4); //Car(String color, String gearType, int door) 호출
	}
	
	Car(String color){
		this(color, "auto", 4);
	}
	
	Car(String color, String gearType, int door){
		this.color = color;   //참조변수this. 인스턴스 자신을 가리킴
		this.gearType = gearType;
		this.door = door;
	}//이렇게 다 Car로 이름이 같다는 건 하는일이 같다는 소리
}

class CarTest2 {

	public static void main(String[] args) {
		Car c1 = new Car();
		Car c2 = new Car("blue");
		
		System.out.println(c1.color + c1.gearType + c1.door);
		System.out.println(c2.color + c2.gearType + c2.door);
	}

}

 

'JAVA' 카테고리의 다른 글

JAVA | 오버라이딩, package, import, 제어자  (0) 2022.01.26
JAVA | 상속, 포함관계  (0) 2022.01.24
JAVA | 객체지향, 인스턴스, 변수와 메서드  (0) 2022.01.22
java | Math.random()  (0) 2022.01.11
java | scanner  (0) 2022.01.02