본문 바로가기
교육/Java&Spring

kosta 클라우드 네이티브 애플리케이션 개발 과정 day 10

by Renechoi 2023. 1. 2.

kosta 클라우드 네이티브 애플리케이션 개발 과정 day 10

 


Static에 대해 알아보자. 

- 객체가 아니라 클래스 자체에 속하는 필드, 메소드, 블록 등의 구성 요소

- static 키워드를 이용하여 선언 

 

public class Employee extends Worker {

    private long employeeId;
    private String hireDate;

    private static int employeeNo = 1;

    public Employee(String name, String birthDate, String hireDate) {
        super(name, birthDate);
        this.employeeId = Employee.employeeNo++;
        this.hireDate = hireDate;
    }

    @Override
    public String toString() {
        return "Employee{" +
                "employeeId=" + employeeId +
                ", hireDate='" + hireDate + '\'' +
                "} " + super.toString();
    }
}

 

메인 함수에서 호출시마다 static으로 선언한 employeeNo 가 카운트 되며 올라간다. 

 

public static void main(String[] args) {

    Employee tim = new Employee("Tim", "11/11/1985",
            "01/01/2020");
    System.out.println(tim);

 

 


 

static의 특징은 -> 객체 소속이 아니라 클래스 소속이라는 점이다

=> 객체 소환이 되지 않더라도 클래스가 로딩 될 때 메모리에 생성됨 

 

main 메서드에 static이 붙는 이유는 객체 생성 필요 없이 항상 실행되도록 하기 위함이다. 

 

static인 main 메서드에서 static이지 않은 메서드를 호출이 가능하지 않다. 

 

 

원래는 이와 같이 객체를 생성해야 한다. 

 

 


static을 활용한 필드 사용 예제 

 

package kosta.basic.day010;

public class StaticExam {

    int total;
    static int grandTotal;

    public static void main(String[] args) {
        StaticExam staticExam1 =  new StaticExam();
        StaticExam staticExam2 =  new StaticExam();

        staticExam1.add();
        staticExam2.add();

        System.out.println(staticExam1.total);
        System.out.println(grandTotal);
    }

    public void add(){
        total += 10;
        grandTotal +=10;
    }
    
}

 

total = 10

grandTotal = 20 

 

 

add 함수가 두번 호출되었고 static변수인 grandTotal은 호출된 횟수 그대로 카운트가 up 되고 사라지지 않으므로 20을 리턴한다. 

 

 


static의 저장 공간은 별도의 data 공간으로 stack이나 heap이 아니다. 

 

 

 

 

 

참고 :http://tcpschool.com/c/c_memory_structure

 

 


자바 api에서 static을 사용하는 경우 

 

Integer.parseInt("1");
Math.random();


final 변수에 대해 알아보자 

 

final int num = 10;

 

선언 후에 수정되지 않는다. 

 

final과 static을 함께 쓰는 이유는 무엇일까? 

=> 한번 생성되고 더 이상 변경되지 않는 값은 곧 static의 성격과 같다. 

 

static final int num = 10;

이러한 값을 상수라고 한다. 

 

이때 네이밍 컨벤션은 대문자. 

 

static final int NUM = 10;

 

public static void constantExample(){
    double pi = Math.PI;
}

 

 

add method에 static을 추가하면 total 변수에서 에러가 발생한다. 

 

 

2가지 이유를 생각해볼 수 있다. 

 

1. runtime 시의 메모리 문제

=> static 메서드는 실행 시에 메모리에 할당 되나 total은 객체 소속으로써 메모리 생성 시점의 차이가 발생한다. 

=> total은 객체가 생성되어야만 생성된다. 

=> 즉 ,존재하지 않는 것을 정의하려고 하므로 문제가 발생한다. 

 

2. member 변수의 선언 문제 

=> 1번 문제에 따라서 정의되지 않은 변수를 사용하는 상황의 문제 

=> data type이 지정되지 않았으므로 

=> 새로운 변수로 할당해주면 문제 해결 

 

 

그렇다면 void일 때는 에러가 나지 않을까?

void의 경우에는 객체가 생성될 때 같이 생성되므로 메모리 생성 시점이 동일하다. 

 

 

 


정적 블록 

 

static {
	arr = new int[100];
    for (int cnt = 0; cnt <100; cnt++){
    	arr[cnt] = cnt;
    }
}

 

정적 블록을 사용하는 이유? 

 

사전에 세팅되어야 하는 경우 

 


 

 

package에 대해 알아보자. 

 

이름이 동일해도 package가 다르면 다른 것으로 인식한다. 

 

 

api를 사용할 때 import를 잘못하면 원하는 메서드를 호출하지 못할 수도 있다.

e.g. data 모듈 

 

 

패키지 이름 정하기

- 자바 식별자를 가지고 만들어야 함. 

 

인터넷 도메인 이름을 활용한 계층적인 패키지 이름 

kr.co.dukesoft.mall.stock 

 

패키지는 중첩돼서 사용되기 보다 다르면 그냥 다르다. 

kosta

kosta.shop

kosta.shop.service 

 

=> 전부 다른 패키지로 본다. 

=> 포함 x 

 


같은 패키지에 있을 때는 별도의 import를 필요로 하지 않는다.

 

서로 다른 패키지의 클래스를 사용할 때는 import를 통해 package를 import 해주어야 한다. 

 


 

접근제어자에 대해 알아보자. 

- private : 같은 클래스 내에서만 사용 가능 

- default (protected) : 같은 패키지 내에서만 접근 가능 

- protected : default + 상속 관계면 접근 가능 

- public : 누구나 

 

 

앞으로는 이제 field를 private로 선언하자 ! 

=> 정보 은닉 (캡슐화) 

 

 

 

클래스 이름과 생성자 이름은 (기본) public으로 쓴다

=> 다른 데서 접근하기 위해 

 


싱글톤 패턴 

 

order 객체가 있다고 생각해보자. 

 

한번만 호출이 되어야 한다고 했을 때 여러번 생성되지 않도록 

 


public class OrderDao {
    
    private static OrderDao dao = new OrderDao();
    
    public static OrderDao getInstance(){
        return dao;
    }
}

 

static으로 생성하여 한 번만 생성하고 다른 클래스에서 소환될 때 하나만 이용할 수 있도록 한다. 

 


public class OrderService {
    private OrderDao dao;

    public OrderService(){
        dao = OrderDao.getInstance();
    }
}

 

 


 

 

 

UML 을 사용해보자. 

 

UML 

   클래스다이어그램

     - 클래스 

         필드 -> attribute

         메서드 -> operation 

 

 

Account 클래스의 속성과 operation을 넣어보기 

 

 

class Person{

    String name;

    int age;

    String address;

    Car myCar; 

}

 

class Car {

   String modelName;

   int price; 

}

 

 

 

주체         ->  대상 

person    ->  car 

(own, drive, , , ,) 

 

 

 

uml 표기 

의존관계 : ⇢ (점선) : 특정 메소드 안에서만 사용

연간관계 : → (실선) : 멤버 변수로서 호출 

 

 

 

 

 

반응형