42_JAVA Study 03
3주차 서브젝트
1. static 변수
#static변수
#static 메서드
#클래스변수
#클래스 메서드
#static 생성 시기
- 학생이 한 명 생성될 때 id가 새로 만들어져야 한다 -> 인스턴스가 공통으로 사용할 변수가 있어야 한다 == static 변수
2. singleton pattern
#singleton pattern
#객체의 유일성
- 디자인 패턴에 대해 일찍 공부할 필요는 없지만 알아두면 좋다 'oop코딩'을 조금 해 보면 된다
- 글로벌 변수는 프로그래밍의 악
3. 변수의 종류와 유효성
#지역 변수
#인스턴스 변수
#static 변수의 scope와 life cycle
생성되는 메모리
#언제 소멸되는지
- 코드 영역과 데이터 영역 중 데이터 영역에 어떤 값이 쓰이는지 (상수, 리터럴 등) 같이 공부할 수 있음
4. 객체 배열
#객체배열사용하기
#얕은복사, 깊은복사
- 프리미티브 변수 X
- 배열 복사한 경우에 기존 배열과 복사한 배열의 내용이 같이 변한다
5. ArrayList
#ArrayList 클래스 메서드
#javaDoc #enhanced for문
- jdk에서 제공하는 객체 배열을 위한 클래스
Static
static 변수와 static 메소드는 static 메모리 영역에 존재하기 때문에 객체가 생성되기 이전에 이미 할당되어 있다 -> 객체의 생성 없이 바로 접근할 수 있다
public class MyCalculator {
public static String appName = "MyCalculator";
public static int add(int x, int y) {
return x + y;
}
public int min(int x, int y) {
return x - y;
}
}
MyCalculator.add(1, 2); // static 메소드 이므로 객체 생성 없이 사용 가능
MyCalculator.min(1, 2); // static 메소드가 아니므로 객체 생성후에 사용가능
MyCalculator cal = new MyCalculator();
cal.add(1, 2); // o 가능은 하지만 권장하지 않는 방법
cal.min(1, 2); // o
Static 변수
- 메모리에 고정적으로 할당되어, 프로그램이 종료될 때 해제되는 변수
- 메모리에 한 번 할당되기 때문에 여러 객체가 해당 메모리를 공유하게 된다
public class Person {
private String name = "Korea";
public void printName() {
System.out.println(this.name);
}
}
'Korea'에 사는 100 명의 데이터를 수집한다고 했을 때 100명이 사는 지역의 이름을 Korea라고 100 번 저장하지 않고 static을 사용하면 메모리 효율이 더 높아진다
public class Person {
public static final String name = "Korea";
public static void printName() {
System.out.println(this.name);
}
}
static 메소드
- static 메소드에서는 static이 선언되지 않은 변수에 접근이 불가능
- static 메소드는 객체의 생성 없이 접근하는 함수이므로 할당되지 않은 메모리 영역에 접근을 하므로 문제가 발생하게 된다 그러므로 static 메소드에서 접근하기 위한 변수는 반드시 static 변수로 선언되어야 한다
- Singleton Pattern
인스턴스가 오직 1 개만 생성되어야 하는 경우에 사용하는 패턴
Singleton Pattern
을 구현할 때 멀티 스레딩 환경에서도 동작이 가능해야 하기 때문에Thread-safe
가 보장되어야 한다
Singleton Pattern
인스턴스가 오직 1 개만 생성되어야 하는 경우에 사용하는 패턴
Singleton Pattern
을 구현할 때 멀티 스레딩 환경에서도 동작이 가능해야 하기 때문에 Thread-safe
가 보장되어야 한다
- Singleton Pattern 방식
Thread-safe 란?
멀티 스레드 환경에서 동작해도 원래 의도한 형태로 동작하는 코드1) Eager Initalzation
static 키워드의 특징을 이용하여 프로그램이 시작하는 시점에서 정적 바인딩을 통해 해당 공유 인스턴스를 메모리에 올려 사용하는 방식2) Lazy initialization
이른 초기화 방식과 정반대로 클래스가 로드 되는 시점이 아닌 인스턴스가 필요한 시점에 요청할 경우 동적 바인딩을 통해 인스턴스를 생성하는 방식 Thread-safe를 만족 시키기 위해서 synchronized 키워드를 사용한다 사용 전까지 메모리를 차지하지 않는 장점이 있다3) Lazy Initialization + Double Checking Locking(DCL, Thread-safe)
위 방법은 많은 thread 들이 인스턴스를 호출할 경우 성능 저하가 발생하기 때문에 이를 개선한 방법이다. 이 방식은 인스턴스가 생성되지 않은 경우에만 동기화 블럭이 실행되게끔 구현하는 방식이다 - **지역 변수, 전역 변수** 변수는 "선언위치"에 따라 전역변수와 지역변수로 나눠진다. - 전역변수(Global variable) : 어느 위치에서든 호출하면 사용이 가능 (함수 밖에 선언하여 클래스 전체에서 사용이 가능한 변수) - 지역변수(Local variable) : 특정구역({ }) 내에서 생성되어 그 구역에서만 사용 (함수 속에 선언되어 해당 함수 속에서만 사용이 가능한 변수) ```java public class HelloAndroid { //메소드 밖에 있는 변수는 전역변수 //전역변수의 생명주기는 클래스 끝 static String strr = "전역변수"; public static void main(String[] args) { System.out.println(strr); String local = "지역변수"; //메소드 안에 넣어준 변수는 지역변수 //지역변수는 해당하는 메소드만 사용 System.out.println(local); method1(); } public static void method1() { System.out.println(strr); //전역변수라 출력 가능 //System.out.println(local); //지역변수이기에 출력 불가. 에러발생 } } ``` ### 1) 전역 변수 - 인스턴스 변수 클래스 영역에 선언되어 객체가 생성될 때마다 만들어지고 생성되었을 때만 호출하여 사용할 수 있음 ```java public class ChangeMoney { int a; //변수 선언 public static void main(String[] args) { ChangeMoney ob = new ChangeMoney(); //이곳에서 사용할 수 있게 선언해준다 System.out.println("int a :" + ob.a); // 전역 변수는 초기화 하지 않아도 자바가 자동으로 해줌.. } } ``` - static 변수 객체를 따로 생성하지 않아도 사용 가능 많으면 실행 속도에 악영향 ```java public class ChangeMoney { static int a; //변수 선언 public static void main(String[] args) { //ChangeMoney ob = new ChangeMoney(); //static을 해주면 선언 안해줘도 이곳에서 사용할 수 있다 System.out.println("int a :" + ob.a); } } ```
변수의 scope와 life cycle
- 변수의 scope
scope란?
선언된 변수, 클래스 등의 사용 범위- Class 안에 var1이란 변수가 선언 됬으면 var1의 스코프는 클래스 전체에서 놀 수 있다. 즉, foo() 메소드 안에서도 들어갈 수 있다
- 하지만 var2는 어떨까? 저 변수의 스코프는 foo() 안에서의 초록색 칸에서만 사용할 수 있다. 즉, 반대로, var2의 집은 foo() 로 한정되어 있으므로, 집밖으로 나갈 수 없다
- 변수의 life cycle
Tlife cycle 란?
모든 변수는 생명 주기를 갖는다- 인스턴스 변수는 객체가 생성될 때, 변수가 생성된다. 즉, 현재 Test 클래스를 static main 메소드나 다른 클래스에서 인스턴스를 생할 때 생성이 된다.
그리고 인스턴스는 참조가 없을 때 가비지 컬렉터가 객체를 지워버리게 되는데 이때, 인스턴스 변수도 같이 소멸된다. - 매개변수는 예를들어 저 코드의 foo() 의 메소드가 호출 될 때 var3가 생성되고 foo() 의 메소드가 종료 시점에 var3로 소멸 된다.
- 지역변수 Local 변수는 ‘ { ‘ 가 시작되는 시점에 생성되며, ‘ } ‘ 로 끝나는 시점에 소멸된다.
- 정적변수는 클래스가 처음 호출 되면서 생성이 되고, 자바 어플리케이션이 종료되는 시점에 같이 소멸된다
- 인스턴스 변수는 객체가 생성될 때, 변수가 생성된다. 즉, 현재 Test 클래스를 static main 메소드나 다른 클래스에서 인스턴스를 생할 때 생성이 된다.
얕은 복사, 깊은 복사
얕은 복사 - 주소 값
을 복사한다 (참조하는 실제 값은 같다)
깊은 복사 - 실제값
을 새로운 메모리 공간에 복사한다 (실제값이 다르다)
- ArrayList 클래스
Collection 프레임워크의 List인터페이스의 제너릭 클래스를 배열 형태로 관리할 수 있도록 하는 클래스로순차적으로 자료를 저장
하여 관리하는 프로그램을 구현할 때 사용되는 클래스 - JavaDoc
java 소스에 문서화를 하는 방법으로 클래스나 메소드에 주석으로 기술한 내용을 javadoc 명령어나 이를 이용한 빌드 툴을 사용하여 문서화할 수 있다 - Enhanced For Loop (향상된 for문)
- 기존 For Loop
for(초기값 ; 조건식 ; 증감식) { // }
2. 향상된 Enhanced For Loop
for(초기화 : 배열) { // }
Enhanced For Loop 장단점
장점 :
- 배열의 크기를 조사할 필요가 없다.
- 반복문 본연의 반복문 구현에 집중하여 구현할 수 있다.
단점 :
- 배열에서만 사용가능하고, 배열의 값을 변경하지 못한다.
썸네일: oneook
Author And Source
이 문제에 관하여(42_JAVA Study 03), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@soooh_42/42JAVA-Study-03저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)