본문 바로가기

STUDY/국비교육

[Java 웹 프로그래밍] 국비지원 5일차 - 전역변수, 전역변수, 정적변수, 클래스, 생성자, this

자바 Storage Class(저장 기억 부류) - 변수의 종류

지역 변수(stack 영역)

  • 메소드 내부에 선언되어 지역 내에서만 유효한 변수를 말한다.
  • 메소드가 실행될 때 생성되고, 메소드 실행이 종료되는 닫는 중괄호( } )를 만났을 때, 메모리에서 사라진다.
  • 사용자가 직접 초기화 해야한다.
  • 다른 메서드에서 접근할 수 없기 때문에 보안성이 뛰어나다. 
public class StorageTest {

	void f1() {
		int num = 0; //지역 변수(갈색)
		// 지역 변수는 직접 초기화하지 않으면 사용할 수 없다.
		System.out.println(num);
		
		// 지역 변수는 해당 지역에서만 접근 가능
//		System.out.println(data);
		
		// 같은 이름의 변수가 지역, 전역 으로 선언되어 있다면 사용시 지역변수가 우선시된다.
		num = 10;
	}
	
	// 매개 변수도 지역변수의 일종이다.
	void f2(int data) {
		
		// 매개변수는 호출시에 초기화가 되기 때문에(호출시 값을 넘겨주기 때문에) 사용이 가능하다.
		System.out.println(data);
		
		// 지역변수 num이 없기 때문에 그 다음으로 가까이에 있는 전역변수 num을 찾아 사용한다.
		num = 10;
	}
}

 

전역 변수(data 영역)

  • 메소드 외부에, 클래스 내부에 선언되어 전체 영역에서 사용가능한 변수이다.
  • 객체가 생성될 때 생성되고, 객체가 소멸될 때 함께 소멸된다. 즉, 프로그램 종료시에 메모리에서 사라진다.
  • new를 만났을 때 초기화된다. 
  • 객체를 통해 클래스의 모든 메소드에서 접근할 수 있다.
  • 다른 영역에서도 접근할 수 있기 때문에, 보안성이 상대적으로 낮다.
public class StorageTest {
	int num; //전역 변수(파란색) - 필드에 선언되는 변수
	int gnum;
	
	public static void main(String[] args) {
    
		// 정적 메소드(static이 붙은 메소드) 내 에서는 일반 전역변수를 사용할 수 없다. 
//		System.out.println(gnum);
	}
    
    	void f1() {
		System.out.println(gnum);
	}
    
    	void f2(int data) {
		// 지역변수 num이 없기 때문에 그 다음으로 가까이에 있는 전역변수 num을 찾아 사용한다.
		num = 10;
		
		System.out.println(gnum);
	}
}

 

정적 변수(data 영역)

  • 클래스 내에 static 키워드를 사용하여 선언된 변수이다.
  • 클래스의 모든 인스턴스들이 공유하는 변수로, 한 번 생성되면 프로그램이 종료될 때까지 유지된다.
  • 컴파일을 하게 되면 가장 먼저 메모리에 올라가고, 어떠한 경우에도 초기화가 되지 않는다.
  • 메모리에 고정되기 때문에 남용시 메모리 혹은 프로그램 실행 속도에 악영향을 준다.
  • 객체 생성 없이도 접근할 수 있다(클래스 이름으로 접근).
  • 정적 메소드에서도 사용할 수 있다.
public class StorageTest {
	static int snum; // 정적 변수(살짝 기울어짐, 이탤릭체)
	
	public static void main(String[] args) {

		System.out.println(snum);
	}
	
	void f1() {
		System.out.println(snum);
	}
	
	void f2(int data) {
		System.out.println(snum);
	}
}

 

저장되는 RAM 영역 Stack Data Data
  지역변수 전역변수 정적변수
초기화 직접 자동 자동
생명주기 { } 프로그램 종료시 프로그램 종료시
접근성

 

 

 

 

 

자바 클래스

  • 변수(데이터, 속성)과 메소드(행위)를 가진 집합으로, 공통 요소들을 추상적으로 묶어 객체를 생성하기 위한 틀이라고 할 수 있다.
  • class 키워드로 정의하고, new 연산자를 통해서 인스턴스를 생성한다. 
  • 클래스에서 객체를 생성하는 과정을 인스턴스화라고 하며, 생성된 객체를 인스턴스라고 한다. 

 

  1. 주어이다. 
  • 모든 문장 맨 앞에 클래스가 나오고 영어는 맨 앞에 대문자로 시작한다.
  • System.out.println();
  • String food = "banana";
  • Monkey.eat(food);
Monkey eat food
[주어] [동사]  [목적어]
클래스  메소드  변수

 

 

2. 타입이다.

  • 클래스는 추상적인 개념이고, 이 클래스 안에는 필드가 존재한다. 
  • 그 필드를 구체화시킬 대상인 객체가 필요하고, 영어로는 instance variable이라 부른다.
  • 추상적인 개념을 구체화시켜 객체를 만드는 작업을 객체화라고 한다.
  • 클래스명 객체명;
  • int data;
  • 따라서 "클래스"는 이 때 만들어지는 "객체의 타입"이다.

 

클래스 구조

구성 요소 역할
멤버 변수 클래스 내에서 사용되는 변수. 클래스의 속성을 나타낸다. 인스턴스 변수(instance variable)라고도 한다.
메소드 클래스 내에서 사용되는 함수. 클래스의 동작을 나타낸다. 인스턴스 메서드(instance method)라고도 한다.
생성자 클래스로부터 객체를 생성할 때 호출되는 특별한 메소드. 객체의 초기화를 수행한다.

 

클래스 선언

다른 클래스 외부에서 선언한다. 주소가 만들어지고 객체가 만들어질 때 주소를 가진다. 

class 클래스명 {
	필드(변수, 메소드) 선언
}

 

 

클래스 사용

  • 클래스는 추상적인 틀이기 때문에 먼저 객체화를 진행한다.
  • 하나의 저장 공간에는 단 한개의 값만 담을 수 있다.
  • 필드에는 여러개의 값이 존재하기 때문에 필드는 다른 곳(Heap)에 할당되고 할당된 필드의 주소값을 저장하는 것이 객체이다. 

 

 

 

 

생성자

인스턴스가 생성될 때 호출되는 '인스턴스 초기화 메소드'이다. 인스턴스 변수의 초기화 작업에 주로 사용되며, 인스턴스 생성 시에 실행되어야 할 작업을 위해서도 사용된다. 

  • 클래스의 필드를 똑같이 복사해서 메모리에 할당하고, 할당된 필드의 주소값을 돌려받는다. (객체화의 목적)
  • 호출 시 내부의 내용을 수행한다. (초기화의 목적)

생성자 역시 메소드처럼 클래스 내에 선언되며, 구조도 메소드와 유사하지만 리턴값이 없다는 점이 다르다. 생성자 조건은 다음과 같다.

  • 생성자의 이름은 클래스의 이름과 같아야 한다.
  • 생성자는 리턴값이 없다. 

생성자도 다른 메소드들과 같이 오버로딩이 가능하므로 하나의 클래스는 여러개의 생성자를 가질 수 있다. 

 

기본 생성자

명시적으로 생성자를 정의하지 않고도 인스턴스를 생성할 수 있는데, 이는 컴파일러가 '기본 생성자'를 제공하기 때문이다. 컴파일러가 자바 소스파일을 컴파일 시에, 클래스에 생성자가 없다면 자동적으로 기본 생성자를 추가하여 컴파일한다. 

 

만약 이미 생성자가 존재하면 기본 생성자를 추가해주지 않는다. 기본 생성자가 없는데 main 메소드에서 기본 생성자를 사용해 인스턴스를 생성하려 하면 에러가 발생한다. 

 

매개변수가 있는 생성자

생성자도 다른 메소드들과 같이 매개변수를 선언하여 사용할 수 있다.

아래 예제에서 String model, String color, int price를 매개 변수로 가지는 생성자는 인자들을 입력받아 멤버 변수인 model, color, price를 초기화하는데 사용한다. 

class Car {
	String carNum;
	String model;
	String color;
	int price;
	
	// 생성자: 객체를 초기화하는 특별한 메서드
	public Car(String model, String color, int price) {
		this.model = model;
		this.color = color;
		this.price = price;
	}
}

 

 

 

 

 

this

this는 참조변수로 인스턴스 자신을 가리킨다. 참조변수를 통해 인스턴스의 멤버에 접근할 수 있는 것처럼 this로 인스턴스 변수에 접근할 수 있다.

public class ClassTest {
	
	public static void main(String[] args) {
//		Car mycar = new Car(); // 객체화
//		System.out.println(mycar); // day05.Car@6f2b958e
//		mycar.model = "Ferrari";  
//		mycar.color = "Red";
//		mycar.price = 70000;
//		System.out.println(mycar.model);
		
		Car mycar = new Car("Ferrari", "Red", 70000);
		Car momcar = new Car("K7", "White", 4000);
		Car dadcar = new Car("G80", "Black", 7000);
		
		mycar.engineStart();
		momcar.engineStart();
		dadcar.engineStart();
	}
}



// 클래스 선언
class Car {

	// (필드) 속성, 성징들을 변수로 선언
	String carNum;
	String model;
	String color;
	int price;
	
	// 기본 생성자(매개변수 없음)
	public Car() {
	}
	
	// 생성자: 객체를 초기화하는 특별한 메서드
	public Car(String model, String color, int price) {
		this.model = model;
		this.color = color;
		this.price = price;
	}
	
	// 메소드: 기능 행위, 클래스의 동작을 정의
	void engineStart() {
		// 지역변수 model이 선언된 것이 없으므로 this. 은 생략이 가능하다.
		System.out.println(model + " 시동 켜기");
	}
	
	void engineStop() {
		System.out.println(model + " 시동 끄기");		
	}
    
	public String method2(int parameter) {
		// 메서드 내용
		return "Result";
	}
    
	// 정적 메서드(static method)
	public static void staticMethod() {
		// 정적 메서드 내용
	}
}

 

 

 

 

참고한 블로그

 

[JAVA] 생성자 (Constructor)

1. 생성자란? 생성자는 인스턴스가 생성될 때 호출되는 '인스턴스 초기화 메서드'이다. 따라서 인스턴스 변수의 초기화 작업에 주로 사용되며, 인스턴스 생성 시에 실행되어야 할 작업을 위해서

jammdev.tistory.com