객체지향 언어
객체지향이론의 기본 개념 :
실제 세계는 사물(객체)로 이루어져 있으며, 발생하는 모든 사건들은 사물간의 상호작용이다.
주요특징
1. 코드의 재사용성이 높다
ㄴ새로운 코드를 작성할 때 기존의 코드를 이용하여 쉽게 작성할 수 있다
2. 코드의 관리가 용이하다.
ㄴ코드간의 관계를 이용해서 적은 노력으로 쉽게 코드를 변경할 수 있다.
3. 신뢰성이 높은 프로그래밍을 가능하게 한다.(규모가 큰 것도 OK)
ㄴ제어자와 메서드를 이용해서 데이터를 보호하고 올바른 값을 유지하도록 하며,
코드의 중복을 제거하여 코드의 불일치로 인한 오동작을 방지할 수 있다
=>코드의 재사용성이 높고 유지보수가 용이하다
클래스
객체를 정의해 놓은 것이자 객체의 설계도 또는 틀이다.
클래스의 정의 : 객체를 정의해 놓은 것
클래스의 용도 : 객체를 생성하는데 사용
객체의 정의 : 실제로 존재하는 것 사물 또는 개념
객체의 용도 : 객체가 가지고 있는 기능과 속성에 따라 다름
클래스와 객체의 예
클래스 | 객체 |
제품 설계도 | 제품 |
Tv 설계도 | TV |
붕어빵 기계 | 붕어빵 |
객체와 인스턴스
클래스로부터 만들어진 객체를 인스턴스(instance)라고 한다.
클래스 —>인스턴스화(제품생성) ㅡ> 인스턴스(객체)
객체의 구성요소 - 속성과 기능
속성 : 멤버변수(member variable) , 특성(attribute), 필드(field), 상태(state)
기능 : 메서드(method), 함수(function), 행위(behavior)
인스턴스의 생성과 사용
클래스명 변수명; Tv t;
변수명 = new 클래스명(); Tv t = new TV():
"인스턴스는 참조변수를 통해서만 다룰 수 있으며, 참조변수의 타입은 인스턴스 타입과 일치해야 한다."
= 참조변수가 없으면 객체 사용불가
객체 배열
객체 배열 안에 객체의 주소를 저장, 참조변수들을 하나로 묶은 참조변수 배열이라 볼 수 있다.
Tv tv1, tv2 tv3; > Tv[] tvarr = new Tv[3]; //길이가 3인 Tv타입의 참조변수 배열
tvArr = 참조변수 배열
**객체배열과 객체생성을 따로 해줘야 한다, 객체 배열도 같은 타입의 객체만 저장할 수 있다.**
클래스의 또 다른 정의
프로그래밍적인 관점에서의 클래스의 정의
클래스 - 데이터와 함수의 결합
데이터 저장개념의 발전과정
변수 => 배열 => 구조체 => 클래스
변수 : 하나의 데이터를 저장할 수 있는 공간
배열 : 같은 종류의 데이터를 하나로 저장할 수 있는 공간
구조체 : 서로 관련된 여러 데이터를 종류에 관계없이 하나로 저장할 수 있는공간
(서로 관계있는 것들을 묶음)
클래스 : 데이터와 함수의 결함( 구조체 + 함수)
클래스의 또 다른 기능
사용자 정의 타입 – 여러개의 변수를 묶어 원하는 타입을 직접 만들 수 있다
비 객체지향 | 객체지향 타입(참조변수 t사용) |
int hour1, hour2, hour3; int minute1, minute2, minute3 float seond1, second2, second3 |
Time t = new Time(); Time t2 = new Time(); Time t3 = new Time(); |
선언위치에 따른 변수의 종류
변수는 클래스 변수(cv), 인스턴스 변수(iv), 지역변수(lv) 모두 3종류가 있다
클래스 변수과 인스턴스 변수
무늬 숫자 (개별) //객체마다 다르게 유지되어야 함 >iv
폭, 높이(공통) //클래스 변수 > cv
iv는 객체마다 만들어지고 cv는 다른공간에 한개만 만들어진다
변수의 종류 | 선언위치 | 생성시기 |
클래스 변수(아무때나 사용가능) cv | 클래스 영역 | 클래스 메모리에 올라갈 때 (필요할 때) |
인스턴스 변수(객체생성을 해야 사용가능) iv | **인스턴스가 생성되었을 때 ** | |
지역변수 lv (메서드 종료시 자동제거) |
클래스 영역 이외의 영역 (메서드, 생성자, 초기화 블럭 내부) |
변수 선언문이 수행되었을 때 |
객체 = iv 변수를 묶어놓은 것
class variables
{
int iv; //클래스 영역 인스턴스 변수선언
static int cv; //클래스 변수 (static변수)
void method() //메서드 선언
{
int lv = 0; // 메서드 영역 지역변수(local variable) 메서드 종료시 자동제거
}
}//클래스 끝
메서드
-특정 작업을 수행하는 일련의 문장들을 하나로 묶은것이다.
-메서드는 클래스 안에 존재해야 한다
메서드의 장점
코드의 중복을 줄일 수 있고
코드의 관리가 쉽다
코드를 재사용 할 수 있다
코드가 간결해서 이해가 쉽다
메서드의 작성
반복적으로 수행되는 여러문장을 메서드로 작성
하나의 메서드는 한가지 기능만 수행하도록 작성
매서드 = 선언부 + 구현부
메서드의 선언과 구현
값(입력)을 받아서 처리하고, 결과를 반환(출력)
반환타입 메서드이름 (타입 변수명, 타입 변수명, ---){ -선언부
//메서드 호출시 수행될 코드 -구현부
}
**메서드의 이름은 변수의 명명규칙대로 작성해야하고, 이름만으로도 기능을 알 수 있도록 노력해야한다.
반환타입
반환 타입이 없을 때 : void를 적어야한다
메서드의 구현부
메서드의 선언부 다음에 오는 괄호{ }를 메서드의 구현부라고 한다.
Return문
실행중인 메서드를 종료하고 호출한 곳으로 돌아간다
메서드의 반환타입이 'void'가 아닌경우, 구현부{ } 안에 'return 반환값;'이 반드시 포함되어야 한다.
매개변수와 달리 return문은 단 하나의 값만 반환할 수 있다.
지역변수(lv) : 메서드 내에 선언된 변수
매개변수도 메서드 내에 선언된 것으로 간주되므로 지역변수이다.
메서드의 호출
메서드이름(값1, 값2, ---); //메서드를 호출하는 방법
print99danAll(); //void print99danAll()을 호출
int result = add(3, 5); // int add(int x, int y)를 호출하고 result에 저장
메서드의 실행흐름
같은 클래스 내의 메서드끼리는 참조변수를 사용하지 않고도 서로 호출이 가능하지만
static메서드는 같은 클래스 내의 인스턴스 메서드를 호출할 수 없다.
JVM의 메모리 구조
응용프로그램이 실행되면, JVM은 시스템으로부터 프로그램을 수행하는데 필요한 메모리를 할당받고
JVM은 이 메모리를 용도에 따라 여러 영역으로 나누어 관리한다.
1. 메서드 영역
클래스가 사용되면 해당 클래스파일을 읽고 저장한다.
2. 힙(heap)
인스턴스가 생성되는 공간(iv 생성)
3. 호출스택(call stack or execution stack)
스택(stack) : 밑이 막힌 상자. 위에 차곡차곡 쌓인다.
메서드 수행에 필요한 메모리가 제공되는 공간
메서드가 호출되면 호출스택에 메모리 할당, 종료되면 해제
매개변수 **중요**
기본형 매개변수 – 변수의 값을 읽기만 할 수 있다(read only)
참조형 매개변수 – 변수의 값을 읽고 변경할 수 있다(read&write)
기본형 – boolean, int, float, double, short, long, byte, char 8개
참조형 그 외
매개변수의 유효성 검사
구현부{ }를 작성할 때, 매개변수의 값이 적절한 것인지 확인하는것이 중요하다.
메서드를 작성할 때 매개변수의 유효성 검사하는 코드를 반드시 넣어야한다.