728x90
this
객체 간의 협력
static
static 응용 : sington 패턴
this
자신의 인스턴스를 스스로 가리키는 예약어
생성자에서 다른 생성자로 호출
자신의 주소를 반환함
public Person(String name, int age) {
this.name = name;
this.age = age;
}
//위 코드에서 this를 생략하게 되면 name이나 age는 파라미터로 사용되는 name과 age로 인식된다.
// 생성자에서 다른 생성자를 호출하는 this
public Person(){
this("이름없음",1);
}
public Person(String name, int age){
this.name = name;
this.age = age;
}
/*
this를 이용하여 다른 생성자를 호출할 때는 그 이전에 어떠한 statement도 사용할 수 없다.
위와 같이 생성자가 여러 개 이고 파라미터만 다른 경우 constructor overloading이라고 한다.
*/
객체간의 협력
학생이 버스나 지하철을 타는 상황을 객체 지향으로 프로그래밍
// 학생 클래스 구현
public class Student {
public String studentName;
public int grade;
public int money;
public Student(String studentName, int money) {
this.studentName = studentName;
this.money = money;
}
public void takeBus(Bus bus) {
bus.take(1000);
this.money -= 1000;
}
public void takeSubway(Subway subway) {
subway.take(1500);
this.money -= 1500;
}
public void showInfo() {
System.out.println(studentName + "님의 남은 돈은 " + money + "입니다.");
}
}
- Student 클래스를 생성하고, studentName, grade, money 3가지 멤버 변수를 선언한다.
- Student 생성자를 생성하고, 매개변수는 studentName, money를 사용한다.
- Bus 클래스에서 만든 take 메서드를 통해 버스를 탔을 때 1,000원이 감소하는 코드를 작성한다.
- Subway 클래스에서 만든 take 메서드를 통해 버스를 탔을 때 1,500원이 감소하는 코드를 작성한다.
- 버스나, 지하철을 이용하고 남은 돈을 출력하는 showInfo()를 작성한다.
// 버스 클래스 구현
public class Bus {
int busNumber;
int passengerCount;
int money;
public Bus(int busNumber)
{
this.busNumber = busNumber;
}
public void take(int money)
{
this.money += money;
passengerCount++;
}
public void showInfo() {
System.out.println("버스 " + busNumber + "번의 승객은 " + passengerCount +"명이고, 수입은 " + money + "입니다.");
}
}
- Bus 클래스를 생성하고, busNumber, passengerCount, money 변수를 생성한다.
- busNumber를 매개변수로 하는 Bus 클래스의 생성자를 생성한다.
- 학생이 버스를 탔을 때 매개변수 money가 증가하고, passengerCount가 증가하는 take 메서드를 작성한다.
- 내가 탄 버스의 승객수와 수입을 출력하는 showInfo()를 입력한다.
// 지하철 클래스 구현
public class Subway {
public String lineNumber;
public int passengerCount;
public int money;
public Subway(String lineNumber) {
this.lineNumber = lineNumber;
}
public void take(int money) {
this.money += money;
passengerCount++;
}
public void showInfo()
{
System.out.println(lineNumber + "의 승객은 " + passengerCount +"명이고, 수입은 " + money + "입니다.");
}
}
Bus 클래스와 동일한 방법으로 Subway 클래스를 생성한다.
// 버스와 지하철 타기
public class TakeTrans {
public static void main(String[] args) {
Student studentJames = new Student("James", 5000);
Student studentTomas = new Student("Tomas", 10000);
Bus bus100 = new Bus(100);
studentJames.takeBus(bus100);
studentJames.showInfo();
bus100.showInfo();
Subway subwayGreen = new Subway("2호선");
studentTomas.takeSubway(subwayGreen);
studentTomas.showInfo();
subwayGreen.showInfo();
}
}
static
static 변수
여러 개의 같은 메모리의 값을 공유하기 위해 사용
// static 변수 사용 방법
static int serialNum; // static 예약어, 자료형, 변수이름;
static 변수는 인스턴스가 생성될 때마다 다른 메모리를 가지는 것이 아니라 프로그램이 메모리에 적재(load) 될 때 데이터 영역의 메모리에 생성됨, 따라서 인스턴스의 생성과 관계없이 클래스 이름으로 직접 참조함
Student.serialNum = 100; // serialNum이 static 변수, 클래스 변수라고도 함
멤버 변수는 다른 말로 인스턴스 변수라고 함
static 메서드
클래스 메서드라고도 함
메서드에 static 키워드를 사용하여 구현
주로 static 변수를 위한 기능 제공
static 메서드에서 인스턴스 변수를 사용할 수 없음
static 메서드도 인스턴스의 생성과 관계없이 클래스 이름으로 직접 메서드 호출
Student.getSerialNum(); //getSerialNum() 이 static 메서드
인스턴스의 변수의 경우 꼭 인스턴스가 먼저 생성되어야 하므로 static 메서드에서는 생성이 불확실한 인스턴스 변수를 사용할 수 없음
변수의 유효범위
변수 유형 | 선언 위치 | 사용 범위 | 메모리 | 생성과 소멸 |
지역 변수(로컬 변수) | 함수 내부에 선언 | 함수 내부에서만 사용 | 스택 | 함수가 호출될 때 생성되고 함수가 끝나면 소멸됨 |
멤버 변수(인스턴스 변수) | 클래스 멤버 변수로 선언 | 클래스 내부에서 사용하고 private이 아니면 참조 변수로 다른 클래스에서 사용 가능 | 힙 | 인스턴스가 생성될 때 힙에 생성되고, 가비지 컬렉터가 메모리를 수거할 때 소멸됨 |
static 변수(클래스 변수) | static 예약어를 사용하여 클래스 내부에 선언 | 클래스 내부에서 사용하고 private이 아니면 클래스 이름으로 다른 클래스에서 사용 가능 | 데이터 영역 | 프로그램이 처음 시작할 때 상수와 함께 데이터 영역에 생성되고 프로그램이 끝나고 메모리를 해체할 때 소멸됨 |
static 응용 : singleton 패턴
전 시스템에 단 하나의 인스턴스만이 존재하도록 구현하는 방식
singleton 패턴에서는 생성자를 private으로 만들고 클래스 내부에 인스턴스를 생성합니다. 그리고 외부에서 해당 인스턴스를 사용할 수 있게 호출해주는 static 메서드를 제공합니다.
// private 생성자
public class Company {
private Company(){}
}
// 인스턴스 생성
public class Company {
private static Company instance = new Company();
private Company(){}
}
// public 메서드 만들기
public class Company {
private static Company instance = new Company();
private Company(){}
public static Company getInstance(){
if(instance == null){
instance = new Company();
}
return instance;
}
}
반응형
'IT' 카테고리의 다른 글
[Java 개발자가 되기 위한 첫걸음 1] 04 배열 (0) | 2022.05.27 |
---|---|
[Do it! 자바 프로그래밍 입문] 07 배열과 ArrayList (0) | 2022.05.26 |
[Do it! 자바 프로그래밍 입문] 05 클래스와 객체1 (0) | 2022.05.25 |
[Java 개발자가 되기 위한 첫걸음 1] 03 코드의 흐름 제어 (0) | 2022.05.24 |
[Java 개발자가 되기 위한 첫걸음 1] 02 다양한 자료형 (0) | 2022.05.24 |