본문 바로가기

수업

[2020.12.17] static

1. static 소스 코드 작성하기

heap 공간에는 static 메모리 공간에 저장되지 않는다. 

static 변수는 class area 에 저장이 된다. 

클래스가 로드 돼서 실행 준비가 될 때 static 변수가 초기화 된다. 

 

멤버 필드는 클래스 로드가 끝나고, main method 실행 하고, 객체 실행 시 초기화 된다. 

 

static field - 클래스가 unload 될 떄, 프로세스가 종료 될 때, JVM 메모리에서 사라진다. 실행 시, 가장 먼저 생성되었다가 종료시 가장 나중에 사라진다. 

 

non static field - 객체가 소멸이 되면, 메모리에서 사라지게 된다. 

 

객체 안에는 static method는 존재 하지 않는다. 

method 선언부는 non static method+만 들어가 있다. 

 

JAVA에서 static 변수들은 모든 객체가 동일한 값을 쓰게 되어 공유 변수라고도 한다. 

 

메서드 찾기 꿀팁!

eclipse 에서 보고 싶은 메서드가 있다면, 클릭한 상태에서 ctrl을 누르면 링크가 나와서 쉽게 찾아갈 수 있다.

 

1.1 this

method 안에 있다면 객체가 생성된 상태, 

생성된 객체를 지칭할 떄는 this를 사용한다. 

this 는 굉장히 상대적이며, method안에서 사용이 가능하다. 

현재 사용중인 객체를 의미한다. 

 

1.2  static method

static method 는 객체 생성과 무관하게 생성이 된다. smethod 사용은 this 예약어를 사용할 수 없다. 

static method를 객체 생성도 안 하고 호출을 할 수도 있다. 

그렇기 때문에 this를 사용할 수 없다. 

그래서 멤버 변수도 사용이 불가하다. 

static method 에서는 non static method를 사용할 수 없다. 

즉, static method는 static field, static method 만 사용이 가능하다. 

 

1.3 method 에서는 static field 와 static method를 사용할 수 있을까? 

YES

객체가 생성된 뒤이기 때문에 static 은 어차피 클래스 area에 저장이 되어 있어 호출이 가능하다. 

 

 

2. static 조금 더 활용하기

Math.pow : 제곱 연산을 할 때 사용하는 메서드 

Math.squr : 루트 연산을 할 떄 사용하는 메서드

 

 

1교시 정리: 

1) static 필드와 메서드는 Class Area에 저장이 된다. 

그렇기 때문에 static 필드와 메서드는 클래스를 앞에 쓰고 (.) 도트 연산자로 호출해서 사용할 수 있다. 

2) static 메서드에서는 non static 필드, 메서드를 사용할 수 없다. 

3) non static 메서드에서는 static 메서드랑 static 필드를 사용할 수 있다. 

4) math도 결국에는 static 메서드였고, 이를 사용하는 것이여서 Math클래스를 쓰고 (.) 도트 연산자를 통해 상세 method들을 호출해서 사용하게 된다. 


2교시

1. fianl

final : 끝이라는 의미이다. 

끝을 의미한다. 

변수 앞에 final이 붙으면 상수처럼 쓰인다. 

즉 값을 바꾸지 못한다. 

final 선언된 변수는 값을 바꿀 수 없다. 

 

static final / final static 은 모두 동일한 의미이다. 순서는 특별히 상관이 없다. 

 

final은 오버라이딩 인터페이스 뒤에 abstract 설명을 할 때, 다시 할 예정

 

final 선언한 변수는 값 변경이 불가하다. 

 

수식어 (=modifier) 변수 앞에 public, static, final 같은 것들

 

위의 그림을 해석하면 PI는 값을 강제로 변경이 불가하며, 바꿔서는 안 된다. 

 

PI 값을 변경하려하니, 컴파일 에러

2. 패키지

접근제어자 (수식어)

src 오른쪽 클릭한 다음 > 패키지 생성 하면, 다음과 같이 생성이 된다. 

 

패키지는 큰 대륙 관리처럼 패키지 단위로 관리를 하게 된다. 

기능이나 특성별로 클래스 관리를 할 수 있다. 

여러 명이 프로젝트에 참여할 경우 너도 나도 클래스를 만들 떄, 클래스 이름이 중복되는 경우가 있을 수 있다. 

내가 만든 패키지에 클래스를 넣는다. 

그 다음에 쟤가 만든 패키지에 클래스를 넣는다. 

각자의 패키지를 만들어서 구분을 한다. 

클래스의 이름이 같아도 패키지가 다르면 다른 클래스로 이해하게 된다. 

패키지 이름이 다르면 클래스의 중복을 피할 수 있다. 

같은 카테고리를 만들기 위해 패키지를 만들게 된다. 

 

2.1 패키지에 클래스 생성

이 과정을 이클립스가 해결해줬다. 

 

패키지의 공통점은 world가 있다. 

즉 큰 그룹인 world안에 asia와 europe가 존재한다. 

world.europe France 

world.asia Korea

world.asia Japan 

이렇게 불러야 한다. 

 

2.2 default package : 패키지가 선언되지 않은 상태

 

2.3 import 사용

import 를 사용하면, 외부의 패키지에 있는 클래스를 자유롭게 사용이 가능하다. 

 

패키지명을 일일히 사용하지 않아도 자유롭게 사용이 가능하다. 

 

*를 사용하면, 패키지에 존재하는 모든 클래스를 불러 올 수 있다. 

 

그러면 실행 속도가 너무 느려지지 않나요? 

Java는 실행시 불러온다. 동적 바인딩. 그렇기 때문에 메인에서 실행이 될때만 찾기 때문에 실행 시간이 오래걸리거나 그러지 않는다. *가 있다고 미리 사용하기 위해 준비하지 않는다. 

 

단, *를 사용하게 되면, 가독성이 많이 떨어진다. 그렇기 때문에 필요한 클래스를 명확하게 쓰는것이 권장된다.

 

2.3.1 eclipse 단축어 ctrl + shift + o

를 사용하게 되면, 필요한 클래스가 알아서 import 된다. 

 

2.4 Java.util.date / java.sql.date > 둘은 모두 date 클래스가 있지만, 패키지가 달라서 다르다. 

java.lang (아주 기본적인 패키지)

java.lang.system

java.lang.string

 

java.io. / 입출력에 관한 약자

 

2.5 패키지이름은 의미가 있어야 한다. 그래야 관리가 수월하다. 

패키지의 이름은 java로 시작하면 안 된다. 왜냐하면 이미 존재하기 때문이다. 

 

2.6 사용자는 주로회사의 도메인 명을 거꾸로 해서 만든다. 

왜냐? 도메인 명은 겹치지 않는다. 

왜 거꾸로 만들까? 

cc.sk.co.kr > kr.co.sk.cc 

samsung.com > com.samsung 

이런식으로 패키지명을 만든다. 

 

2.5 public 

public 공용 개념이다. method 앞에 public을 사용할 수 있다. 

공용으로 하게 되면, 사용자가 맘대로 틀린 값을 대입할 수 있다. 

 

누구나 접근해서 쓸 수 있는 변수

 

2.6 

누구나 접근해서 사용해서는 안 되는 변수

접근 제어를 한다고 한다 

이는 접근 제어자를 통해 할 수 있다.

 

public : 누군나 접근 가능 

없음 : 패키지 상태 디폴트 상태 // 같은 패키지 안이라면 충분히 접근 가능

private : 해당 클래스에서만 사용이 가능

 

2교시 정리

 

1) public : 접근 제어자는 클래스안에 있는 변수들을 외부에서 사용이 가능한지 제어를 한다고 해서 접근 제어라고 한다. 이때, public은 어디서나 외부에서 접근이 된다. 

2) private : 는 해당하는 클래스 내에서만 접근이 되고, 외부에서는 접근이 불가하다. 

3) default : 패키지 내의 클래스는 접근이 가능하지만, 다른 패키지는 접근이 불가하다. 

4) final: final 는 변수에서 사용이 되면, 변수를 바꾸지 않겠다는 의미가 된다. 

5) import : 외부의 패키지에 있는 클래스를 접근하고 싶을떄, 패키지.클래스 이런 방식으로 호출을 해도 되지만, import를 사용하면, 패키지, 클래스 명을 모두 사용할 필요가 없다. import는 패키지를 호출하는 방식으로 모든 클래스를 로드해도 된다. 이때, JAVA는 동적 바인딩이기 때문에 모든 클래스가 로드되지 않고, 필요한 클래스만 실행이 될 때 로드되는 방식이기 때문에 실행 시간이 느려지지 않는다. 


3교시

1. 접근제어자

private : 자기 클래스에서만 접근이 가능. 클래스 내부에서만 접근이 가능. 

default/package :  (접근제어자가 없는 상태) 같은 패키지 내부에서 접근이 가능하다. 

protected (상속 공부한 뒤 학습 예정)

public : 누구나 접근이 가능. 

 

필드값을 private을 사용하더라도, method에서 public으로 만들어서 값을 주게 되면, 외부 클래스에서도 사용이 가능하다. 우회적으로 접근한다. 

값을 반환하는 것은 값을 바꾸지 아니기 때문에 사용이 가능하다. 

 

2. 캡슐화

메소드를 통해서 private로 필드값이 접근 제어된 population을 접근이 가능하게 된다. 메소드는 private상태이다. 

 

setPopulation, getPopulation 를 통해 멤버 변수 (private) 를 접근하고, 활용하고 있다. 

> 자료를 외부에 노출하지 않고 자료를 가린다. = 정보 은닉 information hiding ex) private population

 

은닉된 자료를 메소드를 활용해 사용하게 끔 하는 것을 '캡슐화'라고 한다. 

> 숨겨진 자료를 사용할 방법을 제공해야 한다. 이 방법을 '캡슐화'라고 부른다. 

 

ex) 알약의 다양한 조그만한 알들

알자체가 캡슐화가 되어 있다. 그 조그만한 알이 무슨일을 하는지는 모른다? 외부에 감춰져 있다. 

알약을 전부 먹으면 12시간 동안 콧물이 나오지 않는 기능을 수행한다. 

 

캡슐화와 은닉은 다르다. 

객체 지향의 첫 번째 특성

1. 캡슐화는 은닉된 정보를 사용하는 방법을 제공해야 한다. 

 

> 개발은 혼자서 하는것이 아니다. 

내가 개발한 클래스를 여러 사람이 사용을 한다. 

 

ex) 계좌 잔액

입금, 출금에 따라 잔액이 변동된다. 

잔액을 강제로 0을 추가한다. 0으로 설정하면, 문제가 발생한다.. 

 

계좌 잔액처럼 중요한 데이터는 외부에 노출하면 안된다. 내부에서 가려서 사용을 한다. 그래서 private를 사용한다. 

여러 사람이 참여하는 프로젝트에서는 실수를 줄이기 위해서 중요한 데이터는 외부에 노출되지 않도록 가려야 한다. 

 

2.1 애매한 상태: default 상태

default 는 가급적 만들지 않는 것이 좋다. 테스트 할 때만 사용하세요. 권장하지 않는다. 

 

2.2 protected 접근제어자

더 애매하다. 명확하지 않다. 그래서 권장되지 않는다. 

 

2.3 가장 권장 ; private, public 접근제어자가 권장된다. 

 

3. 객체 지향언어에는 접근 제어자가 제공이된다. 

하지만, 모든 언어가 같은 단어로 접근 제어자를 사용하지는 않는다. 

 

4. 코드 실습

 

Customer c = new Customer("id1", "p1", "홍길동");

String id = c.getID();

 

생성자에도 public 가 붙어야 한다. 필드값에 private가 있기 때문에! 외부 클래스에서 사용을 하기 위해서는! 

 

4-1 . eclipse 쉽게 도움 받는 법

오른쪽 클릭 > source > generate getter, setter / generate field

 

5. java에서는 생성자, setter, getter 는 굉장히 자주 사용된다. 그래서 eclipse에 자동 생성이있다. 

- 하지만 멤버 필드는 반드시 직접 작성을 해야 한다! 

 

3교시 정리 

객체 지향의 가장 큰 특징

1. 캡슐화

캡슐화는 private로 설정된, 즉 숨겨야 하는 중요한 자료들을 접근할 때 사용하는 방법이다. 

자료를 보호하면서 동시에 method를 통해 외부 클래스에서 이를 활용도 할 수 있다. 

2. 접근제어자 다시 정리

private : 클래스 내부에서만 접근이 가능하다. 

public: 클래스 외부에서도 자유롭게 수정이 가능하다. 즉 접근이 가능하다. 

default : 같은 패키지 내의 클래스라면 접근이 가능하지만, 권장되지는 않는다. 

protected : 상속을 배울 때 함께 배울 예정

3. 필드값들이 private로 지정되었다면, 생성자 또한 public을 해줘야 접근이 가능하다! 유의하자! 

4. Eclipse에서는 setter, getter 메소드는 굉장히 흔하게 사용되어 단축키로 제공된다. 

5. 생성자 또한 Eclipse로 제공이 된다! 

6. Field / 멤버 변수는 직접 입력을 해야 한다.  

 


4교시

1. 패키지 이름 확인

vo = value object 값이 될 객체

vo 패키지 : value object용 클래스들 저장

dao 패키지: data access object 용 클래스들 저장 값이 처리될 객체 

 

CustomerDAO - 고객 자료를 처리할 객체

CRUD - creation retrieve update delete / 추가 수정 조회 삭제

 

2. DB 저장 법을 모르기 때문에 임시 저장소를 사용할 예정

임시저장소는 배열을 사용하면 편리하다. 

 

3. 위치상 member field / 지역변수, 매개 변수

member field 자동 초기화 된다. 

지역 변수는 자동 초기화가 되지 않는다. 

 

4. 실습

new CustomerDAO(5); // 최대 다섯명까지 저장이 가능한 customers가 생성

new CustomerDAO(10); // 최대 10명까지 저장이 가능한 customers가 생성

 

 

'수업' 카테고리의 다른 글

[20일차] 2021.01.06 네트워크 프로그래밍  (0) 2021.01.06
[19일차] 2021.01.05  (0) 2021.01.05
[17일차] 2021.01.04  (0) 2021.01.04
[5일차 예습] 정렬  (0) 2020.12.13