나 java봐랏 5일차(클래스와 객체)
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만 가능
}
}
Author And Source
이 문제에 관하여(나 java봐랏 5일차(클래스와 객체)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@khsfun0312/나-java봐랏-5일차클래스와-객체저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)