chapter8. 참조자료형

김현우·2024년 4월 30일
0

java

목록 보기
6/12
post-thumbnail

💻 생성자

인스턴스를 생성할때 사용되는 "인스턴스 초기화 매소드"이다.
특이한점은 리턴값이 없으며 
매소드의 이름을 클래스와 동일하게 해야한다.

예를 들어

pubilc class tmp{
	public tmp(){
    }//생성자
}

꼴로 만든다.

📄 기본 생성자

앞서서 클래스를 만들때 생성자를 만들어 주지 않았음에도 객체를 만들수 있었다.

그 이유는 자바에서는 클래스를 명시적으로 만들지 않으면 자동으로 기본 생성자를 만들어 주기 때문이다.

기본 생성자는 아무런 매개변수가 없는 클래스의 생성자로 다른 생성자가 없으면 만들어지고
다른 생성자가 1개라도 존재하면 만들어 지지 않는다.

📄 내가 만드는 생성자

내가 직접 생성자를 만들수도 있다.
또한 기본생성자와 다르게 매개변수 또한 넣어줄수가 있다.

public 클래스이름(매개변수){
//원하는 작업
} 의 형태로 만들어 사용이 가능하다.
예를들어 
처음 클래스를 만들때 특정 단어로 인스턴스 변수를 할당하고 싶으면
public class reference {
   
	static String word;
    
   	public reference(String startWord){
      	word=startWord;
   	}
	
    public static void main(String []args){
    	
        reference r1 = new reference("hello world");// 생성과 동시에 word값 초기화 가능
        reference r2 = new reference();//기본 생성자는 사용불가
    }
}

위와 같이 사용 가능하다.

이때 생성자가 String을 매개변수로 하는것 한개뿐이기에 아무런 매개변수가 없이 생성은 불가하다.
이를 해결하고 싶으면 여러개의 생성자를 만들어 줘야한다.

📄 생성자 여러개 만들기

그렇다면 생성자는 어떻게 여러개 만드냐!!! 
그냥 이름은 똑같이 매개변수만 다르게 만들어 주면 된다.
이것을 Overloading이라 하며 모든 매소드는 이름은 같지만 매개변수만 다르게 만들수있다.

static String word;
    public reference(){}
    public reference(String startWord){
        word=startWord;
    }
    
위에서 생성자 부분만 짤랐다.
이런식으로 생성자를 2개 만들어주면 매개변수없이 생성도 매개변수의 종류별로 만들어서도
사용 가능하다.

📄 this

자바에는 this 라는 예약어가 존재한다.
객체 자신을 가르키는(자기자신) 예약어이다.

그렇기에 클래스변수, 스태틱 매소드에는 사용이 불가하고
인스턴스 변수, 그냥 매소드에만 사용이 가능하다.

public class reference {
    
    static String word;
    int num;
  
    public static void main(String[] args){
    }
    
	public void setNum(int num){
        //num=num; 이렇게 사용시 어떤 num이 어떤 num인지 알지못함
        this.num=num;// 이와 같이 매개변수의 이름이 같더라도 this를 통해서 구분 가능
    }
}

매소드에도 this가 사용가능한데 이것은 상송을 배운후 알려준다하니 기다려보자!

📄 매소드 overloading

앞에서 생성자 처럼 매소드도 이름은 같지만 매개변수를 다르게해서 만들수가 있다.
이것을 overloading 이라하는데 이걸 어떨때 쓰냐?

지금 까지 내가 계속 사용한
System.out.println(); 매소드가 이런방식이다.
String,int,char 등등 어떤 매개변수가 와도 출력이 가능하게 해준다.

📄 return

한 매소드는 
1. 모든 문장을 끝내면
2. return문 도달
3. 예외 상황( 일단 생략)
이 3경우에 종료된다.

return 문은 딱 하나의 자료형만 넘겨줄수 있다.
그렇기에 다양한 자료형을 넘겨줘야 한다면 객체 자체를 리턴하는것이 좋다.

매소드는 return을 만나면 종료되기에 깔끔한 코드를 만들때 사용하기 좋다

public int ~~~(){
	(그냥 실행할 코드)
    
    if(i!=0){
    0이 아니면 실행할 코드
    }
    
    return 1;
}

이라는 매소드가 있으면 그냥
public int ~~~(){
	(그냥 실행할 코드)
    
    if(i) return 1;
    
    0이 아니면 실행할 코드
    return 1;
}

이런식으로 짤라서 사용이 가능하다.

또한 return 뒤에는 어떤 문장도 오지못한다.
만약 온다면 에러 발생함

📄 Static

main 메소드는 객체를 생성하지 않았는데도 사용이 가능하다.
왜 그런가?? 바로 static 때문이다.

static은 객체를 생성치 않아도 메소드를 사용가능하게 해준다.

그렇다면 모든걸 다 스태틱을 쓰면 되는거 아닌가???
여기에는 문제가 있다.

1. 스태틱 메소드는 오직 클래스 변수만 사용이 가능하다.
2. 클래스 변수는 생성된 모든 객체가 같은 값을 공유한다.

따라서 개별 작업을 할때는 사용이 불가하다.

📄 static 블록

딱 한번만 실행을 해야하는 코드를 만들기 위해서 사용한다.

클래스 내부에 static{}으로 사용한다면
여러 객체를 만들어도 딱 한번만 실행이 된다.

public class staticBlock{
    static int data=1;
    int methodData=2;
    
    public static void main(String[] args) {
        staticBlock sB1=new staticBlock();
        staticBlock sB2=new staticBlock();

        sB1.printInstanceCreate();
    }

    static{
        System.out.println("first static block!");
        data=2;//스태틱 블록은 딱한번만 실행 + 클래스 변수만 컨트롤가능
        //methodData=1;//인스턴스 변수 사용불가
    }

    static{
        System.out.println("second static block!");
        data=3;
    }

    public void printInstanceCreate(){
        System.out.println("객체가 만들어졌습니다");
    }


}



이렇게 여러번 객체를 불러도 딱 한번만 실행이 되며
객체를 부르지 않았도 실행된다.

어떤방식이던 해당 클래스가 참조 된다면 바로 static 블록이 실행된다.

profile
학생

0개의 댓글