반응형
1. 변수
- 변수는 클래스 변수, 인스턴스 변수, 지역 변수 총 세 가지가 있다.
- 변수의 종류를 결정짓는 중요한 요소는 '변수의 선언된 위치'이므로 변수의 종류를 파악하기 위해서는 변수가 어느 영역에 선언되었는지를 확인하는 것이 중요하다.
- 멤버 변수를 제외한 나머지 변수들은 모두 지역 변수이며 멤버 변수 중 static 붙은 것은 클래스 변수, 붙지 않는 것이 인스턴스 변수이다.
변수의 종류 선언 위치 생성시기 클래스 변수 클래스 영역 클래스가 메모리에 올라갔을 때 인스턴스 변수 인스턴스가 생성되었을 때 지역 변수 클래스 영역 이외의 영역
( 메소드, 생성자, 초기화 블록 내부 )변수 선언문이 수행되었을 때 - 인스턴스 변수( instance variable )
- 클래스 영역에 선언되며 클래스의 인스턴스를 생성할 때 만들어진다.
- 인스턴스 변수의 값을 읽어오거나 저장하기 위해서는 먼저 인스턴스를 생성해야 한다.
- 클래스 변수 ( class variable )
- 클래스 변수를 선언하는 방법은 인스턴스 변수 앞에 static을 붙이기만 하면 된다.
- 클래스 변수는 모든 인스턴스가 공통된 저장공간( 변수 )을 공유하게 된다.
- 클래스 변수는 인스턴스 변수와 달리 인스턴스를 생성하지 않고도 언제라도 바로 사용할 수 있는 특징이 있으며 '클래스 이름. 클래스 변수'와 같은 형식으로 사용된다.
- STACK, HEAP이 아니라 CLASS영역이 따로 있다. 거기에는 클래스의 이름과 메모리 등이 들어있는데 그 안에 저장되어서 사용한다.
- 지역 변수( local variable )
- 메소드 내에 선언되어 메소드 내에서만 사용 가능하며 메소드가 종료되면 소멸되어 사용할 수 없게 된다.
- for문 또는 while문의 블록 내에 선언된 지역변수가 선언된 블록{} 내에서만 사용 가능하며 블록을 벗어나면 소멸되어 사용할 수 없게 된다.
- 인스턴스 변수( instance variable )
- 인스턴스 변수는 인스턴스가 생성될 때마다 생성되므로 인스턴스마다 각기 다른 값을 유지할 수 있지만, 클래스 변수는 모든 인스턴스가 하나의 저장공간을 공유하므로 항상 공통된 값을 가진다.
2. 메소드
* 메소드는 특정 작업을 수행하는 일련의 문장들을 하나로 묶은 것이다.
* 기본적으로 수학의 함수와 유사하며, 어떤 값을 입력하면 이 값으로 작업을 수행해서 결과를 반환한다.
- 메소드를 사용하는 이유?
- 높은 재사용성( reusability )
- 한번 만들어 놓은 메소드는 몇 번이고 호출할 수 있으며 다른 프로그램에서도 사용이 가능하다.
- 중복된 코드의 제거
- 같은 내용의 문장들이 여러 곳에 반복해서 나타난다면 이렇게 반복되는 문장들을 묶어서 하나의 메소드로 작성해 놓으면 반복되는 문장들 대신 메소드를 호출하는 한 문장으로 대체할 수 있다.
- 프로그램의 구조화
- 큰 규모의 프로그램에서는 문장들을 작업 단위로 나눠서 여러 개의 메소드에 담아 프로그램의 구조를 단순화시키는 것이 필수적이다.
- main메소드는 프로그램의 전체 흐름이 한눈에 들어올 정도로 단순하게 구조화하는 것이 좋다.
- 높은 재사용성( reusability )
- 메소드의 선언과 구현
* 메소드는 크게 두 부분 선언부와 구현부로 이루어져 있다.
* 메소드를 정의한다는 것은 선언부와 구현부를 작성한다는 뜻이다.
반환 타입 메소드 이름( 타입 변수명, 타입 변수명 ... ) {
// 메소드 호출 시 수행될 코드
}
- 메소드 선언부( method declaration, method header )
- 메소드가 작업을 수행하기 위해 어떤 값들을 필요로 하고, 작업의 결과로 어떤 타입의 값을 반환하는지에 대한 정보를 제공한다.
- 메소드의 선언부는 후에 변경사항이 발생하지 않도록 신중히 작성해야 한다.
- 매개변수 선언( parameter declaration )
- 매개변수는 메소드가 작업을 수행하는데 필요한 값들을 제공받기 위한 것이며 필요한 값의 개수 만큼 변수를 선언하여 각 변수간의 구분을 쉼표로 사용한다.
- 매개변수는 메소드가 작업을 수행하는데 필요한 값들을 제공받기 위한 것이며 필요한 값의 개수 만큼 변수를 선언하여 각 변수간의 구분을 쉼표로 사용한다.
- 메소드 이름( method name )
- 메소드는 특정 작업을 수행하므로 메소드의 이름은 동사인 경우가 많으며, 메소드의 기능을 쉽게 알 수 있도록 함축적이면서도 의미 있는 이름으로 짓도록 노력해야 한다.
- 반환 타입( return type )
- 메소드의 작업 수행 결과인 반환값( return value )의 타입을 적는다.
- 반환값이 없는 경우 반환 타입으로 void를 적어야 한다.
- 메소드의 구현부 ( method body, 메소드 몸통 )
- 메소드의 선언부 다음에 오는 괄호를 메소드의 구현부라고 하는데, 여기에 메소드를 호출했을 때 수행될 문장들을 적는다.
- return문
- 메소드의 반환 타입이 void가 아닌 경우 구현부 안에 "return 반환값;"이 반드시 포함되어야 한다.
- 이 문장은 작업을 수행한 결과인 반환값을 호출한 메소드로 전달하는데 이 값의 타입은 반환 타입과 일치하거나 적어도 자동형 변환 가능한 것이어야 한다.
- return문은 단 하나의 값만 반환할 수 있다.
- 메소드 선언부( method declaration, method header )
- 메소드의 호출
- 메소드를 정의했어도 호출되지 않으면 아무일도 일어나지 않는다.
- 메소드를 호출해야 구현부의 문장들이 수행된다.
* 메소드 이름( 값1, 값2 ... )
- 인자( argument )와 매개변수( parameter )
- 메소드를 호출할 때 괄호 안에 지정해준 값들을 인자 또는 인수라고 하는데 인자의 개수와 순서는 호출된 메소드의 매개변수와 일치해야 한다.
- JVM의 메모리 구조
- 메소드 영역( Method area )
- 프로그램 실행 중 어떤 클래스가 사용되면, JVM은 해당 클래스의 클래스 파일을 분석하여 클래스에 대한 정보를 이곳에 저장한다.
- 이때 그 클래스의 클래스 변수도 이 영역에 함께 생성된다.
- 힙 영역( Heap area )
- 인스턴스가 생성되는 공간, 프로그램 실행 중 생성되는 인스턴스는 모두 이곳에 저장된다.
- 즉, 인스턴스가 생성되는 공간이다.
- 호출 스택( Call Stack )
- 호출 스택은 메소드의 작업에 필요한 메모리 공간을 제공한다.
- 메소드가 호출되면, 호출스택에 호출된 메소드를 위한 메모리가 할당되며, 이 메모리는 메소드가 작업을 수행하는 동안 지역변수들과 연산의 중간결과들을 저장하는 데 사용된다.
- 메소드 영역( Method area )
- 기본형 매개변수와 참조형 매개변수
- 자바에서는 메소드를 호출할 때 매개변수로 지정한 값을 메소드의 매개변수에 복사해서 넘겨준다.
- 매개변수의 타입이 기본형 일 때는 기본형 값이 복사되지만, 참조형이면 인스턴스의 주소가 복사된다.
- 매개변수가 기본형일 때 값만 복사돼서 실제 값은 바뀌지 않는다.
- 매개변수가 참조형일 때 주소( 객체 자체 )가 가기 때문에 실제 값도 바뀐다.
기본형 매개변수 변수의 값을 읽기만 할 수 있다. ( read only ) 참조형 매개변수 변수의 값을 읽고 변경할 수 있다. ( read & write ) - 이때 반환 타입이 참조형이라는 것은 메소드가 객체의 주소를 반환한다는 것이다.
- 클래스 메소드( static method )와 인스턴스 메소드
- 인스턴스 메소드는 인스턴스 변수와 관련된 작업을 하는, 즉 메소드의 작업을 수행하는데 인스턴스 변수를 필요로 하는 메소드이다.
- 인스턴스와 관계없이( 인스턴스 변수나 인스턴스 메소드를 사용하지 않는 ) 메소드는 클래스 메소드로 정의한다.
- 클래스를 설계할 때 멤버 변수 중 모든 인스턴스가 공통으로 사용하는 것에 static을 붙인다.
- 생성된 각 인스턴스는 독립적이기 때문에 각 인스턴스의 변수는 서로 다른 값을 유지한다.
- 그러나 모든 인스턴스에서 같은 값이 유지되어야 하는 변수는 static을 붙여서 클래스 변수로 저장한다.
- 클래스 변수( static )는 인스턴스를 생성하지 않고도 사용할 수 있다.
- static이 붙은 변수는 클래스가 메모리에 올라갈 때 이미 자동적으로 생성되기 때문이다.
- 클래스 메소드는 인스턴스 변수를 사용할 수 없다.
( 인스턴스 변수는 Heap 영역에 생성되어야 사용할 수 있다. 하지만 클래스 메소드는 그 전에 생성된다. )- 인스턴스 변수는 인스턴스가 반드시 존재해야만 사용할 수 있는데 클래스 메소드는 인스턴스 생성 없이 호출 가능하므로 클래스 메소드가 호출되었을 때 인스턴스가 존재하지 않을 수 있다.
- 반면에 인스턴스 변수나 인스턴스 메소드에서 static이 붙은 멤버들은 사용 가능하다.
- 인스턴스 변수가 존재한다는 것은 static변수가 이미 메모리에 존재한다는 것을 의미하기 때문이다.
- 메소드 내에서 인스턴스 변수를 사용하지 않는다면 static을 붙이는 것을 고려한다.
- 메소드 작업 내용 중에서 인스턴스 변수를 필요로 한다면 static을 붙일 수 없다.
- 그러나 인스턴스 변수를 필요로 하지 않는다면 static을 붙이는 것을 고려한다.
- 클래스를 설계할 때 멤버 변수 중 모든 인스턴스가 공통으로 사용하는 것에 static을 붙인다.
반응형
'웹개발 > JAVA' 카테고리의 다른 글
[JAVA] 상속( inheritance ), 오버라이딩( overriding ) (0) | 2022.01.20 |
---|---|
[JAVA] 오버로딩( Overloading ), 생성자( Constructor ), 변수의 초기화 (0) | 2022.01.18 |
[JAVA] 객체지향 언어, 클래스와 객체 (0) | 2022.01.16 |
[JAVA] 배열( array ) (0) | 2022.01.14 |
[JAVA] 제어문( 조건문, 반복문 ) (0) | 2022.01.12 |