티스토리 뷰

Goal 

 - 변수의 생성위치에 따른 유효범위

 - 클래스

 - 자바의 동작 원리

 - instance

1. 변수의 생성위치에 따른 유효범위

 - 메서드 안에서 정의된 변수는 메서드 안에서만 사용가능 

 - 모든 메서드가 공유하는 변수를 만들기 위해서는 각 메서드가 속한 클래스 차원의 변수 '클래스 변수'를 생성하면 됨.

 - public class 안에서 파일을 실행시키는 main 메서드안에서 생성된 변수도 main메서드 안에서만 사용가능.

 

예제 1) 지역변수 선언

 - a() 메서드와 main()메서드에서 각각 i변수를 생성했지만 둘은 다른 변수임. 

 - 각 메소드 안에서 생성한 변수는 그 내부에서만 사용 가능.

public class test {
  static void a() {
      int i = 0; // 메서드 a 내부에서만 사용가능한 '지역 변수' 선언
  }
  
  public static void main() {
    for (int i = 0; i < 5; i++) { // for문 안에서만 유효한 변수 선언
        a();
        System.out.println(i); 
    }
  }
}

2. 클래스

 - 변수와 메서드의 집합.

 - 클래스의 변수와 메서드를 클래스 맴버라 함. 

 - 객체 지향 프로그래밍에서는 클래스를 통해 연관성 있는 클래스 맴버들을 정의해 놓고, 서로 다른 클래스끼리 맴버를 공유하여 사용하는 방식을 통해 재사용성을 높히고, 코드를 깔끔하게 짤 수 있음.

 

3. 자바의 동작 원리

 - 각 java 파일에는 public 클래스가 하나만 존재하며 자바는 컴파일시 public 클래스의 main 메서드를 읽어 자바를 동작시킨다.

 - java는 컴파일시에 java과 동일 코드의 class 파일을 생성한다. public 이외의 클래스도 class 파일로 생성해준다.

 

4. instance

 - Print p1 = new Print(); : Print 클래스를 복제한 새로운 (new)  인스턴스 p1 생성, Print의 데이터타입을 갖는다.

 - 인스턴스는 독립적이다. 인스턴스의 맴버는 생성한 해당 인스턴스를 통해서만 접근할 수 있다. 즉, 인스턴스를 생성하여, 해당 인스턴스만의 값을 지정하고 사용할 수 있다. (객체지향의 본질)

 

5. static 

 - 변수나 메서드에 static이 붙으면 해당 맴버는 클래스 맴버라는 의미.

 - static은 클래스, 인스턴스와 링크로 연결되어 있기 때문에 클래스, 인스턴스로 접근할 수 있고 값을 변경할 수 있다. static의 값을 바꾸면 static과 연결된 인스턴스 및 클래스에 해당하는 요소의 값이 바뀌며, 역도 성립한다.

 

6. 생성자 constructor

 - 생성(초기화)시의 지침

 - 인스턴스를 생성할 때, 실행되어야 할 '메서드', 어떠한 메서드보다 선행된다.

 - 생성자의 이름은 클래스의 이름과 일치한다. 

 - 생성자는 메서드이지만 return 데이터 타입이나 static등을 지정하지 않는다. 또한 메서드 네이밍룰을 따르지 않고 클래스와 이름이 일치하기 때문에 대문자로 시작한다.

 

7. this 키워드

 - constructor 생성시 매개변수를 넣어줄 때, 변경하고자 하는 값과 매개변수를 구별하기 위해 this 키워드를 사용한다.

 - this는 생성한 인스턴스를 가르킨다. 즉, this 키워드를 통해 해당 변수가 현재 인스턴스의 변수임을 명시한다. 

 

예제 1) this를 사용할때와 사용하지 않을 때 차이

class Print {
  public String delimiter;
  public Print (String delimiter){
  delimiter = delimiter //생성자안의 delimiter 변수는 전부 매개변수의 delimiter와 같음.
  }
}
class Print {
  public String delimiter;
  public Print (String delimiter){
  this.delimiter = delimiter //this.delimiter는 생성되는 인스턴스의 변경하고자하는 delimiter값 
  }
}

 

8. instance와 static을 사용하는 이유

 - static은 인스턴스, 클래스에서 둘다 접근할 수 있다.

 - 인스턴스 맴버는 인스턴스 생성을 통해서만 접근 가능하다.

 - 이에따라 static과 인스턴스의 장점과 단점이 존재한다.

 

예제 1) static의 단점  

 - static을 사용하여 valueOfSupply변수를 바꿔주는 경우, 다른 값을 출력 하고 싶을 때, static을 계속 바꿔줘야 하는 코드를 작성해야 함.

class Accounting{
    public static double valueOfSupply;
    public static double vatRate = 0.1;
    public static double getVAT() {
        return valueOfSupply * vatRate;
    }
    public static double getTotal() {
        return valueOfSupply + getVAT();
    }
}
public class AccountingApp {
    public static void main(String[] args) {
        Accounting.valueOfSupply = 10000.0;
        System.out.println("Value of supply : " + Accounting.valueOfSupply);
        System.out.println("VAT : " + Accounting.getVAT());
        System.out.println("Total : " + Accounting.getTotal());
        
        Accounting.valueOfSupply = 20000.0;
        System.out.println("Value of supply : " + Accounting.valueOfSupply);
        System.out.println("VAT : " + Accounting.getVAT());
        System.out.println("Total : " + Accounting.getTotal());
        
        Accounting.valueOfSupply = 10000.0;
        System.out.println("Value of supply : " + Accounting.valueOfSupply);
        System.out.println("VAT : " + Accounting.getVAT());
        System.out.println("Total : " + Accounting.getTotal());
        
        Accounting.valueOfSupply = 20000.0;
        System.out.println("Value of supply : " + Accounting.valueOfSupply);
        System.out.println("VAT : " + Accounting.getVAT());
        System.out.println("Total : " + Accounting.getTotal());
        
        Accounting.valueOfSupply = 10000.0;
        System.out.println("Value of supply : " + Accounting.valueOfSupply);
        System.out.println("VAT : " + Accounting.getVAT());
        System.out.println("Total : " + Accounting.getTotal());
        
  
    }
}

예제 2) 인스턴스의 장점

 - 인스턴스를 사용하여, 각각 인스턴스 변수를 통해 valueOfSupply값을 설정해주면 각 인스턴스마다 고유의 valueOfSupply값이 설정되므로 해당 값만 적용하여 사용할 수 있게 되어 코드가 간결해진다.

class Accounting{
    public double valueOfSupply;
    public static double vatRate = 0.1;
    public Accounting(double valueOfSupply) {
        this.valueOfSupply = valueOfSupply;
    }
    public double getVAT() {
        return valueOfSupply * vatRate;
    }
    public double getTotal() {
        return valueOfSupply + getVAT();
    }
}
public class AccountingApp {
    public static void main(String[] args) {
        Accounting a1 = new Accounting(10000.0);
         
        Accounting a2 = new Accounting(20000.0);
         
        System.out.println("Value of supply : " + a1.valueOfSupply);
        System.out.println("Value of supply : " + a2.valueOfSupply);
         
        System.out.println("VAT : " + a1.getVAT());
        System.out.println("VAT : " + a2.getVAT());
         
        System.out.println("Total : " + a1.getTotal());
        System.out.println("Total : " + a2.getTotal());
         
  
    }
}

 

 - static의 장점도 있다. vatRate와 같이 한번 생성하여 모든 값에 포함하여야 하는 변수를  static으로 선언하면, 값을 바꿀때 인스턴스던 클래스던 모든 vatRate를 사용하는 곳에서 적용되기 때문에, 한번의 값 변경으로 모든 클래스 내부 요소에 적용할 수 있다. (static이 아니었다면, 인스턴스 사용시마다 vatRate값을 바꿔야한다)

 

8. 상속, 인터페이스, 패키지

 - 상속 : 상속을 통해 기능추가, 재사용

 - 인터페이스 : 규격, 목차. 구현은 implements한 파일에서함.

 - 패키지 : 클래스를 정리하는 디렉터리, 같은 이름의 클래스는 다른 패키지에 담아서 공존가능

댓글