2 분 소요

key word : variable, ref, stack, method



변수(Variable)

  1. 데이터 타입에 따른 구분
  • 기본 타입(primitive type, 내장타입, built in)

    • 8가지
    • class가 따로 존재하지 않고 소문자 키워드로 정해져 있음
    • 형태별 / 사이즈별로 세분화 돼있음

      • 문자형 : char, 16bit(다국어 지원 사이즈)
      • 논리형 : boolean(true, false)
      • 실수형 : float(32bit), double(64bit)
      • 정수형 : byte(8bit), short(16bit), int(32bit), long(64bit) -> 왜 2의 거듭제곱 단위를 사용할까? 진수 변환이 쉬워서 그런가,, 기계어가 2진수라 그런가,,
      • 메모리 크기에 따라 형변환시에 자동 형변환이 가능한 경우와 명시적 형변환이 필요한 경우로 나뉜다.
        byte -> short / char -> int -> long -> float -> double
        -> 자동 형변환
        <- 명시적 형변환 필수

      • 정수형의 경우 int가 실수형의 경우 double이 기본
        -> long에 정수를 넣을 때에는 L을, float에 실수를 넣을 때에는 F(f)를 대입하는 수 뒤에 붙여줘야 한다.
  • 참조 타입 (객체를 관리하는 참조 변수, 객체 타입, class 타입)

    • 기본 타입이 아닌 모든 타입
    • 생성시 기본 null로 초기화됨
    • class가 존재하는 범위에 한해 사용자 정의 타입으로 사용 가능
    • API, library로 이미 만들어진 다수의 class 타입이 제공됨. String 등
    • 배열도 참조 타입 변수에 해당
    • String은 String.java로 제공되며 사용 빈도가 높으 기본 타입처럼 사용
      ex) String 변수는 생성시 new 키워드를 사용하지 않아도 됨
    • 객체가 실제로 저장되는 메모리는 heap
    • 객체 생성시 모든 멤버 변수의 공간을 생성, 관리
  1. 선언 위치에 따른 구분
  • 멤버 변수
    • class{} 하위에 선언되는 모든 변수
    • 객체 생성시에 객체 내부에 구성 요소로 생성, 객체 소멸시 자동 삭제
    • JRE의 heap 에 저장되어 가비지 컬렉터(GC)가 처리할 때까지 임의로 지울 수는 없음
    • 객체 생성시 자동으로 기본 값으로 초기화
      • 실수 = 0.0, 정수 = 0, boolean = false, char = ‘\u0000’(유니코드, 아무 값도 없음을 의미), 참조변수 = null
    • 일반(instance) 변수와 static(non-instance) 변수로 나뉜다.
  • 로컬 변수 (temporary, automatic, stack variable)
    • 생성자나 메소드의 인자(argument) 혹은 그 블록{} 내부에 선언되는 변수
    • 생성자나 메소드 호출시에만 메모리에 생성되었다가 실행이 종료될 때 자동 소멸
    • stack 메모리에 저장
  1. final
  • 상수 선언 문법
  • 한 번 초기화한 값을 변경할 수 없다.
  • 대문자_대문자로 명명하는 것이 관례

메소드(Method)

  1. main()

    • main 메소드가 없으면 프로그램이 정삭적으로 실행되지 않음
    • 브라우저 없이 실행되는 일반 자바 프로그램의 시작 지점 기능
  2. 메소드명

    • 명명규칙
      • 소문자로 시작, 두 번째 단어부터 첫 철자만 대문자 사용
    • 사용자 관점에서 기능을 알아보기 쉽게 이름을 선정해야 함 -> 관용적으로 사용되는 메소드 이름 getName(), setName() 등
    • eclipse -> Source -> Generate Getters and Setters 등을 사용해 빠르게 필요한 메소드를 생성할 수 있음

Static

  1. 멤버 변수에 선언

    • static datatype var;
    • byte code(*.class, 실행코드)가 메모리에 로딩될 때 함께 적재(loading, 저장) -> stack이나 heap 메모리에 뭐가 올라오기도 전에 적재되는 것
    • 호출
      • class명.변수명 -> 외부 클래스의 변수 호출시 사용
      • 변수명 -> 동일 클래스 내의 static 변수 호출시 사용
      • 참조변수명.변수명 -> 같은 클래스의 객체들이 같이 공유하는 메모리에 있으므로 사용 가능
    • 다수가 공유해야하는 내용에 사용 권장
    • 생성되는 객체의 데이터가 유일성이 보장돼야 하는 경우 혹은 공유가 금지된 경우 사용이 부적합
  2. 메소드에 선언
    • static returntype method_name(){}
    • 단순하게 메소드만 호출하기 위한 경우, 기능에만 초점을 맞춘 경우 객체 생성 없이 static 메소드 호출해 사용
      ex) Math.abs()
    • 호출
      • 클래스명.메소드명(); -> 외부 클래스의 메소드 호출시 사용
      • 메소드명(); -> 동일 클래스의 메소드 호출시 사용
      • 참조변수명.메소드명(); -> 같은 클래스의 객체들이 같이 공유하는 메모리에 있으므로 사용 가능
  3. static{}
    • main() 메소드보다 우선 실행이 보장되는 블록
    • byte code가 메모리에 로딩될 때 자동 실행
    • 다수 사용자들이 사용하는 공유자원을 한 번만 설정, 초기화할 시 권장

공유 할 데이터와 그렇지 않은 데이터를 구분해 어떤 변수나 메소드에 static을 붙일 지 고민해봐야 함.
특히 객체를 생성하는 것은 리소스를 잡아먹는 일이므로 불필요한 객체 생성을 줄이기 위한 static 사용을 고려해볼 것.

변수 및 메소드 호출

  1. 일반 변수 / 메소드
    • 객체 생성 직후 호출
    • 참조 변수를 통한 호출
    • 호출한 메소드를 caller / 호출돼 실행되는 메소드를 walker라고 부름.
  2. static 변수 / 메소드
    • 객체 생성과 무관하게 호출 가능
    • 참조 변수 없이 호출 가능

업데이트: