1. 자바 프로그램 구조
자바 프로그램은 클래스 구조에서 시작한다.
클래스는 객체지향 개념에서 객체를 정의하는 틀로 객체지향 프로그램 언어의 기본구조이다.
클래스의 기본 구성요소는 변수와 메서드이다.
// 클래스 선언
public class MyClass {
// 변수 선언
int num1;
Message msg;
// 메서드
public void printName(String name) {
...
}
// 메서드
public Message getMessage() {
...
}
// 메인 메서드
public static void main(String[] args) {
// 클래스 인스턴스 생성
MyClass mc = new MyClass();
...
}
}
클래스
대부분의 프로그램은 여러 클래스로 구성되어 실행을 위한 메인 메서드가 필요하다.
인스턴스
실제 클래스를 사용하기 위한 구조로, new() 연산을 통해 생성된다.
메인 메서드에서 클래스부에 선언된 변수(멤버)를 접근 불가능하며, 인스턴스를 통해서만 사용이 가능하다.
인스턴스에서 변수와 메서드의 사용은 인스턴스명.변수명, 인스턴스명.메서드명 과 같은 형식으로 사용한다.
자바 식별자 규칙
- 첫 문자가 문자나 _, $의 특수문자로 시작되어야 한다. 숫자로 시작할 수 없다.
- 첫 문자가 아니라면, 문자나 _, $의 특수문자 그리고 숫자로 구성될 수 있다.
- 자바의 예약어는 식별자로 사용할 수 없다.
- 자바의 식별자는 대소문자를 구분한다.
- 식별자 길이는 제한이 없고 공백은 포함할 수 없다.
식별자 생성 관례
- 클래스 이름은 대문자의 명사로 시작
- 메서드 이름은 소문자의 동사
- 변수는 소문자의 명사
- 상수는 대문자의 명사
2. 변수와 메서드
1) 변수
클래스 타입을 자료형으로 사용할 수 있으며, 타입을 구분하는 개념으로 접근한다.
파이썬 같은 언어같은 경우 타입에 대한 추론을 통해 개발자가 타입에 신경쓰지 않고 코딩도 가능
자바의 경우 원시자료형과 클래스 타입을 모두 지원하며, 원시 자료형에 대한 클래스 타입들은 랩퍼 클래스라고 한다.
변수 선언 방법
[접근 제어자] 타입 변수명
자료형에는 원시자료형과 객체형이 있는데, 객체타입의 변수는 참조변수라고 한다.
int num1 = 10; // 원시자료형 정수 타입
String msg = "Hello"; // 객체타입 문자열 타입
Member member = new Member(); // 객체타입 Member 클래스 타입
- float형을 지정하기 위해서는 실수값 뒤에 F/f를 붙여줘야 함.
- 정수값을 long 형으로 처리하기 위해서는 뒤에 L/l을 붙여줘야 함.
- 문자열은 원시자료형이 아닌 클래스 타입.
int num1; // 정수형 변수
char c1 = 'A'; // 문자형 변수를 선언하고 `A`로 초기화
long num2 = 212355L; // long 정수형 변수를 선언.
float num3 = 13.4F; // float 실수형 변수를 선언.
boolean result = true; // 논리형 변수를 선언하고 true 로 초기화.
자바 변수 유형
프로그램 코드 내에서 변수의 위치에 따라 변수를 구분
멤버변수(Member variable)
- 클래스부에 선언된 변수들로 객체의 속성에 해당.
- 인스턴스 변수와 클래스 변수로 구분됨.
인스턴스 변수(Instance variable)
- 클래스가 인스턴스될 때 초기화되는 변수.
- 인스턴스를 통해서만 접근할 수 있음.
매개 변수(Parameter)
- 메서드에 인자로 전달되는 값을 받기 위한 변수.
- 메서드 내에서는 지역변수 처럼 사용됨.
지역 변수(Local variable)
- 메서드 내에서 선언된 변수.
- 멤버변수와 동일한 이름을 가질수 있으며 지역변수가 우선.
클래스 변수(Class variable)
- static 으로 선언된 변수.
- 인스턴스 생성없이 클래스이름.변수명으로 사용가능.
- main() 메서드에서 참조 가능.
2) 메서드
[접근제어자] 리턴타입 메서드명([인자..]) {
}
리턴타입은 반드시 명시해야 하며 리턴이 없는 경우에도 void를 사용
메서드 오버로딩(Overloading)
- 리턴값이나 인자가 다른 여러 메서드를 동일한 이름으로 선언하는것.
가변 인자(Variable arguments)
- 인자의 수가 유동적인 메서드
- String... msg와 같이 가변인자를 사용.
생성자 메서드(Constructor method)
- 클래스가 인스턴스될 때 호출되는 메서드.
- 클래스 실행시 초기화 작업을 수행.
- 메서드 오버로딩에 의해 여러 생성자가 있을 수 있음.
3. 연산자
사칙연산
+ - * / %
대입연산
= += -= *= /= %= ++ --
비트연산자
& | ^ ~ >> <<
- 비트 시프트시 빈자리는 기본적으로 0으로 채움.
- 단, >> 연산시 최상위비트가 1인(음수를 의미)경우 빈자리는 1로 채워짐.
- 부호가 없는 데이터 연산의 경우 >>>을 사용해 빈자리를 무조건 0으로 채움.
- XOR 연산( ^ )은 같으면 false(0) 다르면 true(1).
- XOR 연산은 주로 암호화와 복호화 할 때 사용
논리연산자 -> ture 혹은 false를 반환하는 연산자로 조건 만족하는지 확인 [if문에서 사용]
&& || !
관계연산자 -> 왼쪽과 오른쪽의 피연산자를 비교한 결과를 true, false로 리턴한는 연산자 [수행조건 체크]
> >= < <= == !=
4. 자바 메모리 관리
JVM은 시스템(운영체제)으로부터 프로그램을 실행하는데 필요한 메모리를 할당받고 할당받은 메모리를 용도에 따라 세 영역으로 나누어 관리
자바는 C언와 같이 직접적인 메모리 주소에 접근할 수 없으며 개발자가 메모리를 할당받거나 반환하지 않아도 되는 구조이지만, 프로그램의 동작구조를 보다 정확하게 이해하기 위해서는 알아야 할 필요는 있다.
메서드 영역 (method area)
프로그램 실행 중 특정 클래스가 사용되면, JVM은 해당 클래스의 클래스파일(*.class)을 읽어서 분석한 다음 클래스에 대한 정보를 이곳에 저장하게 됩니다. 이때 클래스변수나 메서드(static)도 이 영역에 함께 생성됩니다.
main() 에서 클래스에 선언된 변수에 접근할 수 없는 것도 이러한 이유로 main()은 static 으로 선언되어 있기 때문에 클래스에 선언된 멤버변수(인스턴스 변수)를 사용할 수 없으며 인스턴스의 변수들은 힙 영역에 생성되기 때문에 인스턴스를 통해서만 접근이 가능한 것입니다.
힙 영역 (heap area)
프로그램 실행 중 생성되는 인스턴스는 모두 이곳에 생성
즉, 인스턴스 변수들이 생성되는 공간으로 대부분의 메모리 공간은 힙 영역
서버 시스템이나 메모리 사용이 많은 프로그램을 개발하거나 실행할때 힙 메모리 부족으로 문제가 발생할 수 있으며 이 경우 JVM 메모리 옵션을 조정해야 한다.
호출 스택 (call stack or execution stack)
호출스택은 메서드 실행에 필요한 메모리 공간
메서드가 호출될때 호출스택에는 호출된 메서드를 위한 메모리가 할당되며 이 메모리는 메서드가 작업을 수행하는 동안 지역변수 및 매개변수들의 연산 중간결과 등을 저장하는데 사용
메서드가 작업을 마치면 할당되었던 메모리공간은 반환되어 정리(비워짐)
지역변수들의 경우 멤버변수나 다른 함수에서 사용된 변수들과 이름이 같아도 문제가 없는 이유
가비지 컬렉션 (garbage collection)
GC, 쉽게 설명하면 자바에서 사용되지 않는 메모리를 정리해 주는 작업
GC과정은 전체적인 JVM의 성능에 영향을 미치는 요소이고,
가비지 컬렉터(gabage collector)는 가비지 컬렉션을 수행하는 주체이다.
규모가 크지 않거나 특히 컨테이너 기반에서 동작하는(웹서버(WAS) 프로그램이나 안드로이드 등) 프로그램들의 경우
일반 개발자들이 신경쓸 일이 많지 않고 개발자가 직접 System.gc() 를 이용해 가비지 컬렉션을 동작시키는 것은 권장되지 않는다.
[그림] Java Heap 메모리 구조
New/ Young 영역
- Eden : 객체들이 최초로 생성되는 공간
- Survivor 0/1 : Eden에서 참조되는 객체들이 저장되는 공간
Old 영역
- New area에서 일정 시간 참조되고 있는, 살아남은 객체들이 저장되는 공간 Eden영역에 객체가 가득차게 되면 첫번째 GC(minor GC)가 발생함
- Eden영역에 있는 값들은 Survivor 1 영역에 복사되고 이 영역을 제외한 나머지 영역의 객체들은 삭제됨
Permanent Generation
- 생성된 객체들의 정보의 주소값이 저장된 공간
- Class loader에 의해 load되는 Class, Method 등에 대한 Meta 정보가 저장되는 영역
- JVM에 의해서 실행됨
프로그램내에서 GC 대상이 되는것은 다음과 같습니다.
- 모든 객체 참조가 null 인 경우
- 객체가 블럭 안에서 생성되고 블럭이 종료된 경우.
- 부모 객체가 null이 된 경우, 자식 객체는 자동적으로 GC 대상.
- 객체가 Weak 참조만 가지고 있을 경우.
- 객체가 Soft 참조이지만 메모리 부족이 발생한 경우.
자바 객체 참조
좀 더 메모리를 고려하는 프로그램을 개발해야 하는 경우
WeakReference 혹은 SoftReference 를 이용해 객체를 생성해야 적절한 메모리 관리가 이루어 진다.
Strong Reference
- 일반적으로 new를 통해서 객체를 생성할때 발생하는 참조 유형.
- 가비지 컬렉션의 대상에서 제외.
Soft Reference
- 강한 참조와는 다르게 GC에 의해 수거될 수도 있고, 수거되지 않을 수도 있음.
- 메모리에 충분한 여유가 있다면 GC에 의해 수거되지 않음.
- out of memory의 시점에 가깝다면 수거될 확률이 높다.
Weak Reference
- 약한 참조는 GC가 발생하면 무조건 수거됨.
- WeakReference가 사라지는 시점이 GC의 실행 주기와 일치하며 이를 이용하여 짧은 주기에 자주 사용되는 객체를 캐시할 때 유용.
'Java > Java 2' 카테고리의 다른 글
[Java 실습] 3. 자바 기본문법2 (0) | 2021.07.15 |
---|---|
[Java] 3. 자바 기본문법 2 (0) | 2021.07.15 |
[Java 실습] 2. 자바 기본문법 (0) | 2021.07.15 |
[Java] 1. 자바와 자바 가상머신 (0) | 2021.07.15 |
자바 공부하기 (0) | 2021.07.15 |