티스토리 뷰
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한 파일에서함.
- 패키지 : 클래스를 정리하는 디렉터리, 같은 이름의 클래스는 다른 패키지에 담아서 공존가능
'Java > Java Basic' 카테고리의 다른 글
String[] args (Java) (0) | 2020.04.21 |
---|---|
BufferedReader, BufferWriter (Java) (0) | 2020.04.12 |
자바 메모리 관리 - 스택, 힙, 가비지 콜렉터 (0) | 2020.03.13 |
copyOfRange(), copyOf() (Java) (0) | 2020.02.26 |
2차원 배열 (Two Dimensional Array) (0) | 2020.02.24 |
- 20200319
- 20200504
- 20200421
- 20200503
- 20200624
- 20200804
- 20200429
- 20200317
- 20200510
- 20200425
- chapter7
- 20200622
- 20200427
- 20200424
- 20200428
- 20200423
- 20200330
- 20200417
- 20200413
- likelion
- 20200512
- 20200420
- 20200415
- 20201204
- 20200403
- 생활코딩리눅스
- chapter8
- 백준
- 20200406
- 20200502
- Total
- Today
- Yesterday