<객체지향언어>
객체지향언어 = 프로그래밍 언어 + 객체지향 개념
opp 1. 캡슐화 / 2. 상속 / 3.추상화 / 4.다형성
객체지향언어의 특징
1.코드의 재사용성이 높음
2.코드의 관리 용이
3.신뢰성이 높은 프로그래밍 가능하게 됨
<클래스와 객체>
클래스 : 객체를 정의해놓은 것. 즉 객체의 설계도
객체 : 실제로 존해하는 것. 즉 제품.
클래스(설계도)가 필요한 이유는? 객체(제품)을 생성하기 위해
객체(제품)이 필요한 이유는? 객체를 사용하기 위해
객체를 사용한다는 것은? 객체가 가진 속성(변수)와 기능(메서드)를 사용하기 위해
<객체와 인스턴스>
객체 : 모든 인스턴스를 대표하는 일반적 용어
인스턴스 : 특정 클래스로부터 생성된 객체
클래스(설계도) ---인스턴스화--> 인스턴스(객체)
객체의 구성요소 - 속성과 기능
속성(property) - 변수, 특성, 필드, 상태
기능(function) - 메서드, 함수, 행위
class TV {
String color; //속성(변수)
boolean power;
int channel;
void power() {power = !power;} //기능(메서드)
void channelUp() {channel++;}
void channelDown() {channel--;}
}
인스턴스 생성과 사용
클래스명 변수명; //클래스의 객체를 참조하기 위한 참조변수 선언
변수명 = new 클래스명(); //클래스의 객체를 생성 후, 객체의 주소를 참조변수에 저장
Tv t;
t = new Tv();
//1.클래스 작성
class Tv {
String color; //Tv의 속성(멤버변수)
boolean power;
int channel;
void power() { power = !power; } //Tv의 기능(메서드)
void channelUp() { ++channel; }
voud channelDown() { --channel; }
}
class TvTest {
public static void main (String args[]) {
//2.객체생성
Tv t;
t = new Tv();
//3.객체사용
t.channel = 7; //멤버변수channel에 7을 저장
t.channelDown(); //참조변수 t가 참조하고 있는 Tv인스턴스의 채널다운 메서드 호출
System.out.println("현재 채널은 " + t.channel + "입니다.");
}
}
객체 배열 (= 참조변수 배열)
많은 수의 객체를 다뤄야 할 때, 배열로 다루면 편리하기 때문에 배열로 다룸.
참조변수들을 하나로 묶은 참조변수 배열임 그냥
class TvTest {
public static void main(String args[]) {
Tv[] tvArr = new Tv[3]; //길이가 3인 Tv객체 배열
//Tv객체를 생성해 Tv객체 배열의 각 요소에 저장
for( int i=0; i<tvArr.length; i++) {
tvArr[i] = new Tv();
tvArr[i].channel = i+10; //tvArr[i]의 channel에 i+10을 저장
}
for(int i=0; i<tvArr.length; i++) {
tvArr[i].channelUp();
System.out.printf("tvArr[%d].channel=%d%n",i,tvArr[i].channel);
}
}
}
class Tv {
String color; //Tv의 속성(멤버변수)
boolean power;
int channel;
void power() { power = !power; } //Tv의 기능(메서드)
void channelUp() { ++channel; }
voud channelDown() { --channel; }
}
클래스의 또 다른 정의
1. 설계도
2, 데이터 + 함수
3. 사용자 정의 타입
1.변수 : 하나의 데이터를 저장할 수 있는 공간
2.배열 : 같은 종류의 여러 데이터를 하나의 집합으로 저장할 수 있는 공간
3.구조체 : 서로 관련된 여러 데이터를 종류에 관계없이 하나의 집합으로 젖아할 수 있는 공간
4.클래스 : 데이터와 함수의 결합(구조체+함수)
<변수와 메서드>
변수의 종류를 결정짓는 중요한 요소는 '변수의 선언된 위치'이다.
선언위치에 따른 변수의 종류
class Variables {
int iv; //인스턴스변수(클래스영역)
static int cv; //클래스변수(static+iv = cv)
void method(){
int lv = 0; //지역변수(메서드영역)
}
}
인스턴스변수 iv (개별속성)
:클래스 영역에 선언되며, 클래스의 인스턴스를 생성할 때 만들어진다.
iv변수를 여러개 묶어둔것이 객체
->객체생성 후 사용가능
클래스변수 cv (공통속성)
인스턴스변수 앞에 static을 붙이기만 하면 된다.
한 클래스의 모든 인스턴스들이 공통적인 값을 유지해야 하는 속성의 경우 클래스변수로 선언함
cv의 경우 참조변수말고 클래스의 이름을 붙여서 사용함
->아무때나 사용가능
지역변수 lv
메서드 내에 선언되며 메서드가 종료되면 소멸되어 사용할 수 없게 된다.
지역변수가 선언된 블럭 { } 안에서만 사용가능하다.
"인스턴스 변수는 인스턴스가 생성될 때 마다 생성되므로 인스턴스마다 각기 다른 값을 유지할 수 있지만, 클래스 변수는 모든 인스턴스가 하나의 저장공간을 공유하므로, 항상 공통된 값을 가진다."
메서드의 선언과 구현
메서드 선언부
메서드의 선언부에 작업수행 결과인 반환값의 타입을 적어야하는데 반환값이 없는경우 반환타입으로 void를 적어야함
void print99andAll () {
(구현부)
}
메서드 구현부
return문
메서드의 반환타입이 'void'가 아닌 경우, 구현부 {}안에 'return반환값;'이 반드시 포함되어 있어야 한다.
반환타입과 일치하거나 적어도 자동 형변환이 가능한 것이어야 한다.
int add( int x, int y) { //int와
int result = x+y;
return result; //작업결과의 반환타입이 같다
지역변수
메서드 내에 선언된 변수들은 그 메서드 내에서만 사용할 수 있으므로 서로 다른 메서드라면 같은 이름의 변수를 선언해도 된다. 매개변수도 메서드 내에 선언된 것으로 간주되어 지역변수임.
JVM의 메모리 구조
1. 메서드영역
2. 힙 heap
: 인스턴스(인스턴스 변수)가 생성되는 공간
3. 호출스택 call stack
-메서드가 호출되면 수행에 필요한 만큼의 메모리를 스택에 할당받는다.
-메서드가 수행을 마치고나면 사용했던 메모리를 반환하고 스택에서 제거된다.
-호출스택의 제일 위에 있는 메서드가 현재 실행 중인 메서드이다.
-아래에 있는 메서드가 바로 위에 있는 메서드를 호출한 메서드이다.
기본형 매개변수와 참조형 매개변수
1.기본형 매개변수 : 변수의 값을 읽기만 할 수 있다. read only
논리형(boolean), 문자형(char), 정수형(byte, short, int, long), 실수형(float, double)
계산을 위한 실제 값을 저장한다.
class Data { int x; }
class PrimitiveParamEx {
public static void main (Srting[] args) {
Data d = new Data(); //객체생성
d.x = 10;
System.out.println("main() : x = " + d.x); //10출력
change(d.x); //change메서드 호출하면서 d.x가 change메서드 매개변수x에 복사됨
System.out.println("After change(d.x)");
System.out.println("main() : x = " + d.x); //10출력
}
static void change(int x) {
x=1000; //change메서드에서 x의 값을 1000으로 변경
System.out.println("main() : x = " + x); //1000출력 즉, 기본형 매개변수는 변수에 저장된 값을 읽을 수만 있다.
}
}
2.참조형 매개변수 : 변수의 값을 읽고 변경할 수 있다. read , write
객체의 주소를 저장한다. 8개의 기본형을 제외한 나머지 타입
반환타입이 참조형이라는 것은 메서드가 '객체의 주소' 를 반환한다는 것을 의미한다.
class Data { int x; }
class ReferenceReturnEx {
public static void main (Srting[] args) {
Data d = new Data(); //객체생성
d.x = 10;
Data d2 = copy(d); //copy메서드 호출하여 참조변수 d의 값이 매개변수 d에 복사
System.out.println("d.x =" + d.x);
System.out.println("d2.x =" + d2.x);
}
static Data copy(Data d) {
Data tmp = new Data(); //새로운 객체 tmp생성
tmp.x = d.x; //d.x의 값을 tmp.x에 복사한다
return tmp; //복사한 객체의 주소를 반환
}
}
'JAVA' 카테고리의 다른 글
| JAVA | 오버라이딩, package, import, 제어자 (0) | 2022.01.26 |
|---|---|
| JAVA | 상속, 포함관계 (0) | 2022.01.24 |
| JAVA | 변수와 메서드, 오버로딩, 생성자 (0) | 2022.01.23 |
| java | Math.random() (0) | 2022.01.11 |
| java | scanner (0) | 2022.01.02 |