posted by 귀염둥이채원 2019. 2. 28. 20:44

static은 '정적인, 움직이지 않는다'라는 뜻이다.


# static 변수

* static 변수를 “정적 변수”라고도 한다.

* static 키워드를 이용하여 선언한 변수는 해당 클래스의 모든 객체들에 의해 공유된다.

* static으로 선언한 변수는 메모리할당이 한 번만 이루어진다. (메모리 효율적)

* 모든 객체의 공통으로 사용하는 데이터를 관리할때 사용한다.


멤버변수에 static 키워드가 붙으면 인스턴스화를 하지 않고 사용이 가능하다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class B {
    static int count = 0;
    int cnt = 0;
 
    public B() {
        count++;
        cnt++;
        System.out.println("static B : "+count);
        System.out.println("B : "+cnt);
    }
 
    public static void main(String[] args) {
        B b1 = new B();
        B b2 = new B();
        B b3 = new B();
    }
}
cs

결과는 count=3, cnt=1이다.

count는 static 변수라 메모리가 공유되어 있어서 증가가 되지만

cnt는 b1, b2, b3가 각각 새로운 클래스 인스턴스화 되어 메모리 영역이 다르다.


# static 메소드

* static 메소드를 “정적 메소드” 라고도 한다.

* 정적 메소드는 객체가 생성되지 않는 상태에서 호출되는 메소드이다.

* 정적 메소드 안에서는 정적 변수와 지역 변수만 사용할 수 있다.

* 정적 메소드 안에서는 인스턴스 메소드를 호출하지 못한다.

* 정적 메소드는 this 키워드를 사용할 수 없다. this를 참조할 인스턴스가 없기 때문이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class E {
    int e=3;
    static int r =4;
 
    public static void e() {
        System.out.println("hello");
        //e=4;   (e는 인스턴스 변수이므로 클래스 인스턴스화를 해야 사용가능하다)
        new E().e=4;
        r =5//static 변수이므로 사용가능
    }
    public static void main(String[] args) {
        E.e();
    }
}
cs

static 변수는 static 메서드에서 사용가능하지만 

인스턴스 변수는 static 메서드에서 사용 불가능하다.


# static 키워드의 사용범위

1. 모든 인스턴스에 공통적으로 사용해야 할 경우 static을 붙인다.

인스턴스를 생성하면, 서로 독립적이기 때문에 서로 다른 값을 유지하므로 각 인스턴스들이 공통값을 유지하기 위해서는 static을 사용한다.


2. static 키워드가 붙은 멤버변수나 메서드는 인스턴스(객체화)를 생성하지 않아도 사용할 수 있다.

static 변수와, 메서드는, 클래스가 메모리에 올라갈 때 자동으로 생성된다.


3. static이 붙은 메서드에서는 인스턴스 변수(not static)를 사용할 수 없다.


4. 메서드 내에서 인스턴스 변수를 사용하지 않는다면 static을 사용하는 것을 고려한다.

메서드 작업하면서 인스턴스 변수가 필요 하다면 static을 사용할 수 없지만, 인스턴트 변수가 필요 없다면 static을 사용한다. 

왜냐하면 메서드 호출시간이 짧기때문에 효율성이 좋아지기 때문이다.



# 참고사이트

https://mainia.tistory.com/83

https://dev-jangwon.github.io/java/2017/06/26/java-static/

https://includestdio.tistory.com/14

https://clairdelunes.tistory.com/43

posted by 귀염둥이채원 2019. 2. 28. 20:08

자바에서의 final 키워드는 Immutable/Read-only 속성을 선언하는 지시어이다.

final은 해당 entity가 오로지 한 번 할당될 수 있음을 의미이다.

즉 final 필드에 초기값을 저장하면 그 값이 최종값이 되어 수정이 불가능하다.


# final 제어자의 효과

* 클래스: 다른 클래스에서 상속을 하지 못 한다.

* 메소드: 상속 받은 클래스에서 오버라이딩 하지 못한다.

* 클래스 변수: 선언과 동시에 값을 지정하여야하며 이후 수정이 불가하다.

* 인스턴스 변수: 선언과 동시에 초기화하거나 생성자 내에서 값을 지정할 수 있다. 

                      이후에는 수정이 불가하다.

* 지역 변수: 선언과 동시에 초기화하거나 그 이후에 값을 지정할 수 있다. 이후에는 수정이 불가하다.


1. 클래스의 final 멤버 변수

1.1 선언과 함께 정의한 경우

상수이다. 주로 변수명은 모두 대문자로 구성되어야 한다. 아래와 같이 다시 값을 대입하려고 하면 컴파일 에러가 발생한다.

public class Solution {
	final int LIMIT = 10;
	void foo(){
		LIMIT = 11; //Error: cannot assign a value to final variable LIMIT
	}
}

1.2 선언만 하고 정의하지 않은 경우

반드시 constructor내에서 값이 초기화 되어야 한다.

public class Solution {
    final int limit;
    public Solution(final int limit) {
        this.limit = limit;	//OK
    }
    ...
}

constructor외의 메소드에서 값을 초기화하는 것은 안된다.

public class Solution {
    final int limit;
    public Solution(final int limit) {
		setLimit(limit);
    }
    public void setLimit(final int limit) {
        this.limit = limit; //Error: cannot assign a value to final variable LIMIT
    }
    ...
}

2. static final 변수

2.1 선언과 함께 정의한 경우

상수이다. 주로 변수명은 모두 대문자로 구성되어야 한다.

public class Solution {
    final static int LIMIT = 10;

    public static void main(String[] args) {
        System.out.println(Solution.LIMIT);
    }
}

아래와 같이 다시 값을 대입하려고 하면 컴파일 에러가 발생한다.

public class Solution {
    final static int LIMIT = 10;

    public static void main(String[] args) {
        System.out.println(Solution.LIMIT);
        Solution.LIMIT = 11; //Error: cannot assign a value to final variable LIMIT
    }
}

2.2 선언만하고 정의하지 않은 경우

반드시 static block에서 초기화 되어야 햔다.

public class Solution {
    final static int LIMIT;
    
    static {
    	LIMIT = 10;
    }

    public static void main(String[] args) {
        System.out.println(Solution.LIMIT);
    }
}

3. 메소드의 final 파라미터

const와 같은 의미이다. 값을 대입할 수 없다.

public class Solution {
    void tryToChagne(final int count, int length) {
        count = 10;	//Error: cannot assign a value to final variable count
        length = 10; //OK
    }
}

4. final Collection 변수

Collection instance를 다시 정의 할 수는 없다.

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

public class Solution {
    public static void main(String[] args) {
        final List<Integer> list = new ArrayList<>();
        list = new LinkedList<>(); //Error: cannot assign a value to final variable list
    }
}

하지만, 삽입이나 삭제는 가능하다.

import java.util.ArrayList;
import java.util.List;

public class Solution {
    public static void main(String[] args) {
         final List<Integer> list = new ArrayList<>();
         list.add(1);
         list.add(2);
         list.remove(0);
    }
}

5. final 메소드

5.1 일반

final 메소드는 오버라이드를 할 수 없다는 의미이다.

class Parent {
    final void thisIsFinal() {
    }
    void thisIsNotFinal() {
    }
}

public class Solution extends Parent {
    @Override
    void thisIsFinal() { //Error: thisIsFinal() in Solution cannot override thisIsFinal() in Parent
  overridden method is final
    }

    @Override
    void thisIsNotFinal() {	//OK    
    }
}

5.2 final constructor

constructor는 final일수 없다!!!

public class Solution {
    final public Solution() { //Error: modifier final not allowed here
    }
}

6. final 클래스

final class는 상속할 수 없다.

final class Parent {
}

public class Solution extends Parent { //Error: cannot inherit from final Parent
}

7. interface

7.1 final로 선언되지 않은 변수들

interface의 변수의 값을 바꾸려 하면 아래와 같이 final 변수를 바꾸려는 시도이기 때문에 안된다고 한다. 즉, interface의 멤버 변수들은 모두 final이다.

interface Solvable {
    int LIMIT = 10;
}

public class Solution implements Solvable {
    void tryToChange(){
        LIMIT = 1; //Error: cannot assign a value to final variable LIMIT
    }
}

7.2 final로 선언된 메소드 선언

interface의 메소드 선언은 final을 허용하지 않는다.

interface Solvable {
    public final void hey(); //Error: modifier final not allowed here
}

public class Solution implements Solvable {
    public void hey() {
    }
}

# 참고사이트

http://hochulshin.com/java-final-keyword/

https://djkeh.github.io/articles/Why-should-final-member-variables-be-conventionally-static-in-Java-kor/

https://library1008.tistory.com/1

posted by 귀염둥이채원 2019. 2. 28. 19:57

블로그(네이버, 티스토리)에 프로그래밍 관련 소스 코드를 포스팅할때 가독성이 중요하다.

소스코드를 하이라이트해서 예쁘게 포스팅하는 두가지 방법이 있다.


# 티스토리 소스코드 하이라이트

1. Colorscripter 사용

2. SyntaxHighlighter 사용


# Colorscripter 

- https://colorscripter.com/ 

- 웹페이지에서 소스 코드를 변환하여 포스팅에 붙여 넣는 방법

- 설치가 필요없고 사용법이 쉽다.

남들에게 URL주소를 공유하면서 소스코드를 공유할 수 있다


# SyntaxHighlighter

- http://alexgorbatchev.com/SyntaxHighlighter/ 

- 오픈소스 자바 스크립트를 pre 태그로 포스팅하는 방법

- 설치 및 설정이 번거롭지만 테마 종류가 다양하다.


# 참고사이트

https://tbbrother.tistory.com/43

https://ingorae.tistory.com/342