객체지향언어 |
실제 세계는 사물(객체)로 이루어져 있으며, 발생하는 모든 사건들은 사물간의 상호작용이다.
특성
- 코드의 재사용성이 높다.
새로운 코드를 작성할 때 기존의 코드를 이용하여 쉽게 작성할 수 있다. - 코드의 관리가 용이하다.
코드간의 관계를 이용해서 적은 노력으로 쉽게 코드를 변경할 수 있다. - 신뢰성이 높은 프로그래밍을 가능하게 한다.
제어자의 메서드를 이용해서 데이터를 보호하고 올바른 값을 유지하도록 하며, 코드의 중복을 제거하여 코드의 불일치로 인한 오동작을 방지할 수 있다.
클래스와 객체 |
클래스
클래스의 정의: 클래스란 객체를 정의해 놓은 것이다.
클래스의 용도: 클래스는 객체를 생성하는데 사용된다.
객체
프로그래밍에서 객체는 클래스에 정의된 내용대로 메모리에 생성된 것을 뜻함
객체의 정의: 실제로 존재하는 것, 사물 또는 개념
객체의 용도: 객체가 가지고 있는 기능과 속성에 따라 다름
유형의 객체: 책상, 의자, 자동차, TV와 같은 사물
무형의 객체: 수학공식, 프로그램 에러와 같은 논리나 개념
어떤 클래스로부터 만들어진 객체를 "인스턴스"라 하며 클래스로부터 객체를 만드는 과정을 "인스턴스화"라고 한다.
객체의 속성: 멤버변수, 특성, 필드, 상태
기능: 메서드, 함수, 행위
인스턴스의 생성과 사용
인스턴스는 참조변수를 통해서만 다룰 수 있으며, 참조변수의 타입은 인스턴스의 타입과 일치해야한다.
클래스명 참조변수명; //클래스의 객체를 참조하기 위한 참조변수를 선언
참조변수명 = new 클래스명(); //클래스의 객체를 생성 후, 객체의 주소를 참조변수에 저장
TV tv; //TV클래스 타입의 참조변수 tv를 선언
tv = new TV(); //TV인스턴스를 생성한 후, 생성된 TV인스턴스의 주소를 tv에 저장
참조변수의 인스턴스 주소는 변경 될 수 있다.
TV tv1 = new TV();
TV tv2 = new TV();
tv1 = tv2; //참조변수 tv1이 가리키던 인스턴스의 주소값이 tv2의 인스턴스의 주소값으로 바뀐다
객체 배열
객체를 배열로 다루는 것이 가능하며 이를 객체배열이라고 한다.
객체배열은 참조변수들을 하나로 묶은 참조 변수 배열인 것이다.
TV[] tvArray = new TV[3]; //참조변수 배열(객체 배열)을 생성
//객체를 생성해서 배열의 각 요소에 저장
tvArray[0] = new TV();
tvArray[1] = new TV();
tvArray[2] = new TV();
// or TV[] tvArray = {new TV(), new TV(), new TV()};
클래스의 또 다른 정의
변수: 하나의 데이터를 저장할 수 있는 공간
배열: 같은 종류의 여러 데이터를 하나의 집합으로 저장할 수 있는 공간
구조체: 서로 관련된 여러 데이터를 종류에 관계없이 하나의 집합으로 저장할 수 있는 공간
클래스: 데이터와 함수의 결합(구조체 + 함수)
변수와 메서드 |
변수
변수는 클래스변수, 인스턴스변수, 지역변수 모두 세 종류가 있다.
class Variavles
{
int instanceVariable; //인스턴스변수
static int classVariable; //클래스변수(static변수, 공유변수)
void method(){
int localVariable; //지역변수
}
}
클래스변수
- 클래스가 메모리에 올라갈 때 생성
- 선언방법은 인스턴스변수 앞에 static을 붙이면 됨
- 클래스변수는 모든 인스턴스가 공통된 저장공간(변수)을 공유 함
인스턴스변수
- 클래스 영역에 선언되며, 클래스의 인스턴스를 생성할 때 만들어짐
- 인스턴스를 생성해야 사용 가능
- 인스턴스는 독립적인 저장공간을 가지므로 서로 다른 값을 가질 수 있음
지역변수
- 메서드 내에 선언되어 메서드 내에서만 사용 가능
- 메서드가 종료되면 소멸
메서드
- 메서드는 특정 작업을 수행하는 일련의 문장들을 하나로 묶은 것
- 메서드에 입력과 반환하는 출력만 알면 된다.(black box 라고도 함)
- 메서드는 선언부와 구현부로 이루어져 있음
메서드의 특징
1. 높은 재사용성
2. 중복된 코드의 제거
3. 프로그램의 구조화
메서드의 선언부
- 반환타입(int), 메서드이름(add), 매개변수 선언(int x, int y)로 구성
int add(int x, int y)
{
int sum = x + y;
return sum;
}
메서드의 구현부
- 메서드의 선언부 다음에 오는 괄호{}를 메서드의 구현부라고 함
JVM의 메모리 구조 |
JVM은 시스템으로부터 프로그램을 수행하는데 필요한 메모리를 할당받고 JVM은 이메모리를 용도에 따라 여러 영역으로 나누어 관리한다.
세 가지 주요 영역
- 메서드 영역(method area)
- 프로그램 실행 중 어떤 클래스가 사용되면, 해당 클래스의 클래스파일(*.class)을 읽어 클래스에 대한 정보를 저장
- 클레스 데이터, 클래스변수 등 - 호출스택(call stack 또는 execution stack)
- 메서드의 작업에 필요한 메모리 공간을 제공 함
- 메서드가 호출되면 수행에 필요한 만큼의 메모리(지역변수들과 연산의 중간결과 등)를 스택에 할당받음
- 메서드가 수행을 마치고나면 사용했던 메모리를 반환하고 스택에서 제거
- 호출스택의 제일 위에 있는 메서드가 현재 실행 중인 메서드
- 아래에 있는 메서드가 바로 위의 메서드를 호출한 메서드 - 힙(heap)
- 인스턴스가 생성되는 공간
- 프로그램 실행 중 생성되는 인스턴스는 모두 이곳에 생성
- 인스턴스변수들이 생성되는 공간
기본형과 참조형 |
기본형 매개변수: 변수의 값을 읽기만 할 수 있다.(read only)
참조형 매개변수: 변수의 값을 읽고 변경할 수 있다.(read & write)
class Data{int x;}
public class Main {
public static void main(String[] args){
Data data = new Data();
data.x = 10;
System.out.println(data.x); //10
primitiveChange(data.x);
System.out.println(data.x); //10 기본형 매개변수 복사
referenceChange(data);
System.out.println(data.x); //1000 참조형 매개변수(주소) 복사
}
static void primitiveChange(int x) {
x = 1000;
}
static void referenceChange(Data data) {
data.x = 1000;
}
}
배열도 객체와 같이 참조변수를 통해 데이터가 저장된 공간에 접근하기 때문에 참조 변수와 같은 결과 얻음
public class Main {
public static void main(String[] args){
int[] array = {10};
array[0] = 10;
System.out.println(array[0]); //10
change(array);
System.out.println(array[0]); //1000
}
static void change(int[] array) {
array[0] = 1000;
}
}
참조형 반환타입
반환타입이 '참조형'이라는 것은 메서드가 '객체의 주소'를 반환한다는 것을 의미한다.
재귀호출
- 메서드의 내부에서 메서드 자신을 다시 호출하는 것을 '재귀호출'이라 하고, 이를 '재귀 메서드'라 함
- 메서드의 입장에선 자신을 호출하는 것과 다른 메서드를 호출하는 것에 차이가 없음
- '메서드 호출'이라는 것이 그저 특정 위치에 저장되어 있는 명령들을 수행하는 것 뿐이기 때문
- 호출된 메서드는 '값에 의한 호출'을 통해, 원래의 값이 아닌 복사된 값으로 작업하기 때문에 호출한 메서드와 관계없이
독립적인 작업수행이 가능
- 복잡한 코드를 재귀호출을 통해 보다 단순한 구조로 변경 가능
int factorial(int n){ //단순 반복문을 통한 함수
int result = 1;
while(n != 0)
result *= n--;
reutn result;
}
int factorial(int n){ //재귀 함수
if(n == 1) return 1;
return n * factorial(n-1);
}
클래스 메서드(static메서드)와 인스턴스 메서드
클래스 메서드
- 메스드 앞에 static이 붙은 메서드
- 객체를 생성하지 않고도 '클래스이름.메서드이름(매개변수)'와 같은 식으로 호출이 가능
- 인스턴스와 관계없는(인스턴스 변수나 인스턴스 메서드를 사용하지 않는) 메서드를 클래스 메서드로 정의
인스턴스 메서드
- 반드시 객체를 생성해야만 호출 가능
- 인스턴스 변수와 관련된 작업을 하는, 즉 메서드의 작업을 수행하는데 인스턴스 변수를 필요로 하는 메서드
- 인스턴스 변수는 인스턴스를 생성해야만 만들어지므로 인스턴스 메서드 역시 인스턴스를 생성해야만 호출 가능
1. 클래스를 설계할 때, 맴버변수 중 모든 인스턴스에 공통으로 사용하는 것에 static을 붙인다.
2. 클래스 변수(static 번수)는 인스턴스를 생성하지 않아도 사용할 수 있다.
3. 클래스 메서드(static메서드)는 인스턴스 변수를 사용할 수 없다.
4. 메서드 내에서 인스턴스 변수를 사용하지 않는다면, static을 붙이는 것을 고려한다.
- 클래스의 맴버변수 중 모든 인스턴스에 공통된 값을 유지해야하는 것이 있는지 살펴보고 있으면, static을 붙여준다.
- 작성한 메서드 중에서 인스턴스 변수나 인스턴스 메서드를 사용하지 않는 메서드에 static을 붙일 것을 고려한다.
'프로그래밍 > JAVA' 카테고리의 다른 글
[JAVA 이론] 오버로딩 & 오버라이딩 (2) | 2022.01.22 |
---|---|
[JAVA 이론] 객체지향 프로그래밍_2 (0) | 2022.01.22 |
[JAVA 이론] 배열 (0) | 2022.01.15 |
[JAVA 이론] 조건문과 반복문 (0) | 2022.01.12 |
[JAVA 이론] 연산자 (0) | 2021.12.28 |