[JAVA] 자바 변수, 메소드, Static
key word : variable, ref, stack, method
변수(Variable)
- 데이터 타입에 따른 구분
-
기본 타입(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
- 객체 생성시 모든 멤버 변수의 공간을 생성, 관리
- 선언 위치에 따른 구분
- 멤버 변수
- class{} 하위에 선언되는 모든 변수
- 객체 생성시에 객체 내부에 구성 요소로 생성, 객체 소멸시 자동 삭제
- JRE의 heap 에 저장되어 가비지 컬렉터(GC)가 처리할 때까지 임의로 지울 수는 없음
- 객체 생성시 자동으로 기본 값으로 초기화
- 실수 = 0.0, 정수 = 0, boolean = false, char = ‘\u0000’(유니코드, 아무 값도 없음을 의미), 참조변수 = null
- 일반(instance) 변수와 static(non-instance) 변수로 나뉜다.
- 로컬 변수 (temporary, automatic, stack variable)
- 생성자나 메소드의 인자(argument) 혹은 그 블록{} 내부에 선언되는 변수
- 생성자나 메소드 호출시에만 메모리에 생성되었다가 실행이 종료될 때 자동 소멸
- stack 메모리에 저장
- final
- 상수 선언 문법
- 한 번 초기화한 값을 변경할 수 없다.
- 대문자_대문자로 명명하는 것이 관례
메소드(Method)
-
main()
- main 메소드가 없으면 프로그램이 정삭적으로 실행되지 않음
- 브라우저 없이 실행되는 일반 자바 프로그램의 시작 지점 기능
-
메소드명
- 명명규칙
- 소문자로 시작, 두 번째 단어부터 첫 철자만 대문자 사용
- 사용자 관점에서 기능을 알아보기 쉽게 이름을 선정해야 함 -> 관용적으로 사용되는 메소드 이름 getName(), setName() 등
- eclipse -> Source -> Generate Getters and Setters 등을 사용해 빠르게 필요한 메소드를 생성할 수 있음
- 명명규칙
Static
-
멤버 변수에 선언
- static datatype var;
- byte code(*.class, 실행코드)가 메모리에 로딩될 때 함께 적재(loading, 저장) -> stack이나 heap 메모리에 뭐가 올라오기도 전에 적재되는 것
- 호출
- class명.변수명 -> 외부 클래스의 변수 호출시 사용
- 변수명 -> 동일 클래스 내의 static 변수 호출시 사용
- 참조변수명.변수명 -> 같은 클래스의 객체들이 같이 공유하는 메모리에 있으므로 사용 가능
- 다수가 공유해야하는 내용에 사용 권장
- 생성되는 객체의 데이터가 유일성이 보장돼야 하는 경우 혹은 공유가 금지된 경우 사용이 부적합
- 메소드에 선언
- static returntype method_name(){}
- 단순하게 메소드만 호출하기 위한 경우, 기능에만 초점을 맞춘 경우 객체 생성 없이 static 메소드 호출해 사용
ex) Math.abs() - 호출
- 클래스명.메소드명(); -> 외부 클래스의 메소드 호출시 사용
- 메소드명(); -> 동일 클래스의 메소드 호출시 사용
- 참조변수명.메소드명(); -> 같은 클래스의 객체들이 같이 공유하는 메모리에 있으므로 사용 가능
- static{}
- main() 메소드보다 우선 실행이 보장되는 블록
- byte code가 메모리에 로딩될 때 자동 실행
- 다수 사용자들이 사용하는 공유자원을 한 번만 설정, 초기화할 시 권장
공유 할 데이터와 그렇지 않은 데이터를 구분해 어떤 변수나 메소드에 static을 붙일 지 고민해봐야 함.
특히 객체를 생성하는 것은 리소스를 잡아먹는 일이므로 불필요한 객체 생성을 줄이기 위한 static 사용을 고려해볼 것.
변수 및 메소드 호출
- 일반 변수 / 메소드
- 객체 생성 직후 호출
- 참조 변수를 통한 호출
- 호출한 메소드를 caller / 호출돼 실행되는 메소드를 walker라고 부름.
- static 변수 / 메소드
- 객체 생성과 무관하게 호출 가능
- 참조 변수 없이 호출 가능