Java 정리 - 4 (String 클래스의 메소드, 변수의 스코프, static, 싱글톤, enum)

Minseol·2022년 7월 29일
0

Java 공부

목록 보기
5/12

String Class가 제공하는 메소드 이용하기

문자열 길이 구하기

  • str.length()는 str이 참조하는 문자열의 길이를 구해서 int 타입으로 리턴해주는 메소드이다.

문자열 붙이기 (concat)

  • str.concat("world") 메소드는 str 이 참조하는 문자열 hello 에다가 메소드의 인자로 들어온 문자열 world 를 붙혀서 String 타입으로 리턴하는 메소드다.
  • String Class는 불변 클래스로, 메소드가 수행되면, 새로운 문자열을 만든다. 그러므로, 원래 클래스는 변하지 않는다.
    String str = new String("hello");

    System.out.println(str.concat(" world"));  //출력결과는 hello world 
    System.out.println(str);  //출력결과는 hello 

문자열 자르기 (subString)

  • str.subString(1,3) 은 str이 참조하는 문자열을 인덱스 1번부터 3번까지 자른 결과이다.
  • str.subString(2) 은 str이 참조하는 문자열을 2번 인덱스부터 마지막까지 자른 결과를 의미한다.

변수의 스코프

프로그램 상에서 사용되는 변수들은 사용 가능한 범위를 가진다. 그 범위를 변수의 스코프라고 한다.

변수가 선언된 블럭이 그 변수의 사용범위이다.

    public class ValableScopeExam{

        int globalScope = 10;   // 인스턴스 변수 

        public void scopeTest(int value){   
            int localScope = 10;
            System.out.println(globalScope);
            System.out.println(localScpe);
            System.out.println(value);
        }
    }
  • 클래스의 속성으로 선언된 변수 globalScope 의 사용 범위는 클래스 전체 이다.
  • 매개변수로 선언된 int value 는 블럭 바깥에 존재하기는 하지만, 메서드 선언부에 존재하므로 사용범위는 해당 메소드 블럭내이다.
  • 메소드 블럭내에서 선언된 localScope 변수의 사용범위는 메소드 블럭내이다.

main메소드에서 사용하기

    public class VariableScopeExam {
        int globalScope = 10; 

        public void scopeTest(int value){
            int localScope = 20;            
            System.out.println(globalScope);
            System.out.println(localScope);
            System.out.println(value);
        }   
        public static void main(String[] args) {
            System.out.println(globalScope);  //오류
            System.out.println(localScope);   //오류
            System.out.println(value);        //오류  
        }   
    }
  • 같은 클래스 안에 있는데 globalScope 변수를 사용 할 수 없다.
  • main은 static한 메소드이다. static한 메소드에서는 static 하지 않은 필드를 사용할 수 없다.

static

공통으로 사용하는 변수가 필요한 경우

  • 여러 인스턴스가 공유하는 기준 값이 필요한 경우
  • 같은 클래스 내에 있음에도 해당 변수들을 사용할 수 없다.
  • main 메소드는 static 이라는 키워드로 메소드가 정의되어 있다. 이런 메소드를 static 한 메소드 라고 한다.
  • static한 필드(필드 앞에 static 키워드를 붙임)나, static한 메소드는 Class가 인스턴스화 되지 않아도 사용할 수 있다.
  • 인스턴스가 생성될 때 만들어지는 변수가 아닌, 처음 프로그램이 메모리에 로딩될 때 메모리를 할당한다.
    public class VariableScopeExam {
        int globalScope = 10; 
        static int staticVal = 7;

        public void scopeTest(int value){
            int localScope = 20;        
        }

        public static void main(String[] args) {
            System.out.println(staticVal);      //사용가능 
        }

    }

static한 변수는 공유된다.

  • static하게 선언된 변수는 값을 저장할 수 있는 공간이 하나만 생성된다. 그러므로, 인스턴스가 여러개 생성되도 static한 변수는 하나다.
    VariableScopeExam v1 = new VariableScopeExam();
    VariableScopeExam v2 = new VariableScopeExam();
    v1.globalScope = 20;
    v2.globalScope = 30; 

    System.out.println(v1.globalScope);  //20 이 출력된다. 
    System.out.println(v2.globalScope);  //30이 출력된다. 

    v1.staticVal = 10;
    v2.staticVal = 20; 

    System.out.println(v1.staticVal);  //20 이 출력된다. 
    System.out.println(v2.staticVal);  //20 이 출력된다. 
  • globalScope같은 변수(필드)는 인스턴스가 생성될때 생성되기때문에 인스턴스 변수라고 한다.
  • staticVal같은 static한 필드를 클래스 변수라고 한다.
  • 클래스 변수는 레퍼런스.변수명 하고 사용하기 보다는 클래스명.변수명 으로 사용하는것이 더 바람직하다. (예시: VariableScopeExam.staticVal)

static 메서드(클래스 메서드)에서는 인스턴스 변수를 사용할 수 없다

  • static 메서드는 인스턴스 생성과 무관하게 클래스 이름으로 호출 될 수 있음
  • 인스턴스 생성 전에 호출 될 수 있으므로 static 메서드 내부에서는 인스턴스 변수를 사용할 수 없음

변수의 유효 범위와 메모리

변수의 유효 범위(scope)와 생성과 소멸(life cycle)은 각 변수의 종류마다 다름

지역변수, 멤버 변수, 클래스 변수는 유효범위와 life cycle, 사용하는 메모리도 다름

static 변수는 프로그램이 메모리에 있는 동안 계속 그 영역을 차지하므로 너무 큰 메모리를 할당하는 것은 좋지 않음

클래스 내부의 여러 메소드에서 사용하는 변수는 멤버 변수로 선언하는 것이 좋음

멤버 변수가 너무 많으면 인스턴스 생성 시 쓸데없는 메모리가 할당됨

상황에 적절하게 변수를 사용해야 함

static 응용 - 싱글톤 패턴(singleton pattern)

프로그램에서 인스턴스가 단 한 개만 생성되어야 하는 경우 사용하는 디자인 패턴

static 변수, 메소드를 활용하여 구현할 수 있음

열거형(enum)

자바는 열거타입을 이용하여 변수를 선언할 때 변수타입으로 사용할 수 있다.

  • 열거형 정의 방법
    enum Gender{
        MALE, FEMALE;
    }
  • 열거형 사용 방법
    Gender gender2;

    gender2 = Gender.MALE;
    gender2 = Gender.FEMALE;

    //Gender타입의 변수에는 MALE이나 FEMALE만 대입이 가능. 다른 값은 저장할 수가 없다.  

특정 값만 가져야 한다면 열거형을 사용하는 것이 좋다.

profile
귀여운 설이에양

0개의 댓글