Day 20 (23.01.20)

Jane·2023년 1월 20일
0

IT 수업 정리

목록 보기
20/124

1. 지정 제어자의 특징

  • 지정 제어자를 붙이지 않는 경우
    • 패키지 앞에 붙이지 않는다.
    • 인스턴스 변수(클래스 안에 있는 변수) 안에는 붙이지만, 지역 변수(함수 안에 있는 변수) 안에는 붙이지 않는다. 지역변수는 함수가 끝나면 사라지기 때문이다.
  • 클래스 앞에는 public, default 만 붙는다. (private는 오류)
  • 1 파일 안에 1 public class (public class가 2개 이상이면 오류)

2. static

2-1. static 비교해보기

static이 없는 코드

class InstCnt {
	int instNum = 0;
	
	InstCnt(){
		instNum++;
		System.out.println("인스턴스 생성 : " + instNum);
	}
	
}

public class ClassVar {

	public static void main(String[] args) {
		InstCnt cnt1 = new InstCnt();
		InstCnt cnt2 = new InstCnt();
		InstCnt cnt3 = new InstCnt();
	}
}

[Console]
인스턴스 생성 : 1
인스턴스 생성 : 1
인스턴스 생성 : 1


static이 있는 코드

class InstCnt {
	static int instNum = 0;
    // static 변수 / 공유 변수 / 클래스 변수 / 정적 변수
	
	InstCnt(){
		instNum++;
		System.out.println("인스턴스 생성 : " + instNum);
	}
	
}

public class ClassVar {

	public static void main(String[] args) {
		InstCnt cnt1 = new InstCnt();
		InstCnt cnt2 = new InstCnt();
		InstCnt cnt3 = new InstCnt();
	}
}

[Console]
인스턴스 생성 : 1
인스턴스 생성 : 2
인스턴스 생성 : 3


  • static을 사용하면 메모리를 따로 공유하게 된다.
  • 프로그램을 실행하면 클래스에서 static을 체크하고 메모리를 잡아준다. (객체 생성보다 먼저 한다)
  • 객체 생성을 할 때는 이미 자리잡은 static을 제외한 나머지 부분을 메모리에 올린 다음 실행한다. (static은 한번만 메모리에 올린다)

2-2. static의 접근

  • static은 인스턴스를 통한 접근 뿐만 아니라, 클래스를 통한 접근도 가능하다.
class AccessWay{
	static int num = 0;
	
	AccessWay(){ incrCnt(); }
	
	void incrCnt() { num++; }
}

public class JavaPractice {

	public static void main(String[] args) {
		AccessWay way = new AccessWay(); // 객체 생성할 때 1 증가
		way.num++; // 직접 접근으로 1 증가
		AccessWay.num++; // 클래스(생성자 함수)로 접근해서 1 증가
		System.out.println("num = " + AccessWay.num); // 3 출력
	}
}

[Console]
num = 3

2-3. static 초기화

class InstCnt {
	static int instNum = 100;
	
	InstCnt(){
		instNum++;
		System.out.println("인스턴스 생성 : " + instNum);
	}
	
}

public class JavaPractice {

	public static void main(String[] args) {
		InstCnt.instNum -= 15; // 객체 생성을 하지 않아도 오류가 나지 않는다!
		System.out.println(InstCnt.instNum);
	}
}
  • static은 공유하는 변수이므로, 외부에서 직접적인 접근을 해도 오류가 나지 않는다.
  • 생성자 함수 안에는 되도록 static 변수를 선언하지 않는다. (static 변수는 공유 목적이다. 생성자 함수 안에 있으면 객체를 생성할 때마다 매번 새로워진다.)
  • 대부분의 static은 public을 준다.

2-4. static의 활용

  • static을 붙여주면 객체를 생성할 때마다 매번 생성하지 않아도 된다. 변하지 않는 값은 static으로 고정시켜준다.
class Circle {
	static final double PI = 3.1415;
	private double radius;
	
	Circle(double rad) {radius = rad;}
	
	void showPerimeter() {
		double peri = (radius * 2) * PI;
		System.out.println("둘레 : " + peri);
	}
	
	void showArea() {
		double area = (radius * radius) * PI;
		System.out.println("넓이 : " + area);
	}
}



public class JavaPractice {

	public static void main(String[] args) {
		Circle c1 = new Circle(1.5);
		
		c1.showPerimeter();
		c1.showArea();
	}
}

3. static 이용한 객체 생성 예제

class Baby{
	static int instNum = 0;
	
	Baby(){
		instNum++;
		System.out.println("Baby 생성 : " + instNum);
	}
}


public class JavaPractice {

	public static void main(String[] args) {
        Baby cnt1 = new Baby();
        Baby cnt2 = new Baby();
        Baby cnt3 = new Baby();
	}
}

[Console]
Baby 생성 : 1
Baby 생성 : 2
Baby 생성 : 3

profile
velog, GitHub, Notion 등에 작업물을 정리하고 있습니다.

0개의 댓글