티스토리 뷰

목차



    반응형
    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;
        }
    }
    반응형