💻 생성자
인스턴스를 생성할때 사용되는 "인스턴스 초기화 매소드"이다.
특이한점은 리턴값이 없으며
매소드의 이름을 클래스와 동일하게 해야한다.
예를 들어
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");
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){
this.num=num;
}
}
매소드에도 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 블록이 실행된다.
![](https://velog.velcdn.com/images/rachi_3/post/e3bfaed5-e41f-4ec2-a72a-dc6658a62ec7/image.png)