본문 바로가기
IT

[Do it! 자바 프로그래밍 입문] 06 클래스와 객체2

by csongin 2022. 5. 25.
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 + "입니다.");
     }
}
  1.  Student 클래스를 생성하고, studentName, grade, money 3가지 멤버 변수를 선언한다.
  2.  Student 생성자를 생성하고, 매개변수는 studentName, money를 사용한다.
  3.  Bus 클래스에서 만든 take 메서드를 통해 버스를 탔을 때 1,000원이 감소하는 코드를 작성한다.
  4.  Subway 클래스에서 만든 take 메서드를 통해 버스를 탔을 때 1,500원이 감소하는 코드를 작성한다.
  5.  버스나, 지하철을 이용하고 남은 돈을 출력하는 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 + "입니다.");
    }


}
  1.  Bus 클래스를 생성하고, busNumber, passengerCount, money 변수를 생성한다.
  2.  busNumber를 매개변수로 하는 Bus 클래스의 생성자를 생성한다.
  3.  학생이 버스를 탔을 때 매개변수 money가 증가하고, passengerCount가 증가하는 take 메서드를 작성한다.
  4.  내가 탄 버스의 승객수와 수입을 출력하는 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;
    }
}
반응형