42_JAVA Study 03

수빈·2021년 12월 10일
0

42JAVA

목록 보기
4/9
post-thumbnail

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

얕은 복사, 깊은 복사

얕은 복사 - 주소 값을 복사한다 (참조하는 실제 값은 같다)
깊은 복사 - 실제값을 새로운 메모리 공간에 복사한다 (실제값이 다르다)

  • ArrayList 클래스
    Collection 프레임워크의 List인터페이스의 제너릭 클래스를 배열 형태로 관리할 수 있도록 하는 클래스로 순차적으로 자료를 저장하여 관리하는 프로그램을 구현할 때 사용되는 클래스
  • JavaDoc
    java 소스에 문서화를 하는 방법으로 클래스나 메소드에 주석으로 기술한 내용을 javadoc 명령어나 이를 이용한 빌드 툴을 사용하여 문서화할 수 있다
  • Enhanced For Loop (향상된 for문)
  1. 기존 For Loop

for(초기값 ; 조건식 ; 증감식) { // }
2. 향상된 Enhanced For Loop

for(초기화 : 배열) { // }

Enhanced For Loop 장단점

장점 :

  1. 배열의 크기를 조사할 필요가 없다.
  2. 반복문 본연의 반복문 구현에 집중하여 구현할 수 있다.

단점 :

  1. 배열에서만 사용가능하고, 배열의 값을 변경하지 못한다.

썸네일: oneook

profile
42Seoul -soooh ~ 2022.04

0개의 댓글