나 java봐랏 5일차(클래스와 객체)

김혜성·2021년 7월 18일
0

나 java봐랏

목록 보기
5/7

this

역할

  • 자신의 메모리 가르킴
  • 생성자에서 다른 생성자 호출
  • 자신의 주소 반환
package thisex;

class Birthday{
	int day;
	int month;
	int year;
	
	public void setYear(int year) {
		// year = year; 이렇게 쓰면 둘다 지역변수인 setYear의 인수 의미 - 의미업쓰
		this.year = year; // 이렇게 해야 멤버변수 의미(파랑)
	}
	
	public void printThis() {
		System.out.println(this); //this가 뭘까용
	}
}

public class ThisExample {

	public static void main(String[] args) {
		
		Birthday b1 = new Birthday();
		System.out.println(b1);
		b1.printThis();	//b1의 주소를 this가 가르킴을 알 수 이따
		
		Birthday b2 = new Birthday();
		System.out.println(b2);
		b2.printThis(); //다른 인스턴스는 다른 주소 가르킴(b1과 b2의 주소 다름)

	}

}

위의 코드는 this의 첫번째, 세번째 역할을 확인하는 코드이다

package thisex;

class Person{
	String name;
	int age;
	
	public Person() {
		this("이름없음", 1); // 이런 식으로 다른 생성자를 생성자에서 불러서 쓸 수 있다
		//주의!!! 다른 생성자 쓸 때에는 반드시 다른 변수 선언이 먼저 있어서는 안된다
		//다른 생성자 호출이 가장 먼저 이루어져야함(이유는 강의에서 이해 잘 안됨)
	}
	
	public Person(String name, int age) {
		this.name = name;
		this.age = age;
	}
	
	public Person returnSelf() {
		return this;
	}
}
public class CallAnotherConst {

	public static void main(String[] args) {
		Person p1 = new Person();
		System.out.println(p1.name);	//이름없음
		System.out.println(p1.returnSelf()); //자기자신
		

	}

}

여기서는 this를 통해서 다른 생성자를 생성자에서 불러서 사용할 수 있음을 알 수 있다.

객체의 협업

객체의 협업은 객체끼리 상관관계가 있을 때 영향을 줄 수 있도록 객체 내에서 다른 객체를 인수로 받아서 사용할 수 있음을 의미한다
ex) 대중교통, 학생을 각각 객체로 만들었을 때 학생이라는 객체 안에는 대중교통을 타는 기능과 돈이라는 변수가 있을텐데, 대중교통을 타는 기능을 실행했을 때 돈은 줄어들어야하고, 대중교통 객체의 입장에서는 탑승인원이 늘어나고 돈이 추가되도록 해야하겠죠?
이럴 때 객체의 협업이 필요한거에요!

public void takeBus(Bus bus) {
		bus.take(1250);; //#########핵심 key!!!!!!!!!!!!
		//요것이 객체의 "협업" 인 것이다
		money -= 1250; //학생이 이만큼 돈 갖고있는지도 따져주면 더 좋겠쥬?
	}

위의 코드는 Student라는 클래스 안의 takeBus라는 메소드에서 Bus 객체를 인수로 불러와서 사용하는 객체의 협업입니다

버스, 지하철 둘다 take라는 메소드가 있기에 이걸 상위 클래스(추상 클래스)인 trans에서 만들어서 관리할 수도 있다
이 경우 student 클래스는 bus, subway가 아닌 trans라는 상위 클래스와 협업하면 된다

static 변수

모든 인스턴스가 공유하는 값을 선언할 때 static 변수로 선언한다
"정적 변수"
인스턴스 변수는 new 할 때 힙메모리에 할당됨
static 변수는 전체 프로그램이 메모리에 load될 때 할당됨(상수, 리터럴 등과 함께)

  • static 자료형 변수이름
  • == 클래스 변수
  • 인스턴스의 생성과 무관하게 클래스 이름으로 직접 참조함
    ex) james.serialNum = 100;으로 안하고
    Student.serialNum = 100;으로 함


이렇게 인스턴스는 힙 메모리에, 지역변수는 스택 메모리에, static, const, literal 등은 데이터 영역에 할당됨
변수들이 가르키는 static이 동일함(화살표 같은거 가르킴)

참고

package staticex;

public class Student {
	int studentID;
	String studentName;
	
	private static int serialNum = 10000;//정보 은닉을 위해 private
	
	public Student() {
		serialNum++; //공유되면서 증가됨
		studentID = serialNum; //공유X 각 인스턴스마다 다르게 됨
	}
	
	public static int getSerialNum() {// getter만 사용(setter는 아예 사용X)
		int i = 10; //이처럼 지역변수를 선언하는 것은 가능
		//but!!!!!!!!!!
		//StudentName = "Comet"; //이처럼 static method안에서 인스턴스 변수 선언은 불가능
		// static 메소드는 인스턴스 변수를 메인에서 선언하지 않고도
		//Student.getSerialNum으로 사용할 수 있는데, 이 경우에는 선언되지도 않은
		//인스턴스 변수인 studentName이 호출된거기에 에러 발생!!!
		
		
		return serialNum;
	}
}

이 코드를 실행하는 메인코드도 아래에 넣습니당

package staticex;

public class StudentTest1 {

	public static void main(String[] args) {
		Student studentJ = new Student();
		System.out.println(studentJ.studentID); //10001
		
		Student studentT = new Student();
		System.out.println(studentT.studentID); //10002
		
		System.out.println(studentJ.getSerialNum()); //이 둘은 공유되는 static 변수라
		System.out.println(studentT.getSerialNum()); //같은 값이 들어있다
		//이런식으로 안쓴다(인스턴스 변수가 아니라 클래스 변수.static으로 쓴다)
		//Student.serialNum으로.
		//인스턴스 생성 안해도 serial은 출력됨
	}

}

이부분은 코드 내에서 주석으로 다 자세하게 설명했으니 더이상의 설명은 생략한다

singleton 패턴

객체를 여럿이 아닌 단 하나만 생성할 경우 쓰임

  • C에서는 글로벌로 선언해주면 된다
  • Java에서는 Class 외부에는 뭘 선언할 수 없다
  • 글로벌 변수 대신 static 이용
  • 여럿이 생성될 수 있기에 private로 생성자를 만들어서 막아준다
  • public으로 선언된 static 메서드를 제공한다
package singleton;

public class Company {
	
	private static Company instance = new Company(); //내부에서 생성된 인스턴스
	
	private Company(){}//외부에서 Company()를 함부로 선언할 수 없다
	
	public static Company getInstance() {//getter
		if(instance == null) {
			instance = new Company();
		}
		return instance;
		//static으로 메소드 생성 안해도 사용가능
	}
}

흠...익숙해지지않으면 절대 못쓰겠네

package singleton;

import java.util.Calendar;

public class CompanyTest {
	public static void main(String[] args) {
		Company company = Company.getInstance();
		Company company2 = Company.getInstance();
		
		System.out.println(company);
		System.out.println(company2);//같게나온다!
		
		
		Calendar cal = Calendar.getInstance(); //이런것도 getInstance만 가능
	}
}
profile
똘멩이

0개의 댓글