객체지향이론의 기본 개념: 실제 세계는 사물(객체)로 이루어져 있으며, 발생하는 모든 사건들은 사물간의 상호작용
객체지향언어의 주요특징
1. 코드의 재사용성이 높다.
2. 코드의 관리가 용이하다.
3. 신뢰성이 높은 프로그래밍을 가능하게 한다.
→ 클래스는 객체를 생성하는데 사용되며, 객체는 클래스에 정의된 대로 생성됨.
클래스명 변수명; //클래스의 객체를 참조하기 위한 참조변수를 선언
변수명 = new 클래스명(); //클래스의 객체를 생성 후, 객체의 주소를 참조변수에 저장
Magician magic;
magic = new Magician();
class Magician {
//마법사의 속성(멤버변수)
String hair; //머리 색상
int level; //레벨
int energy; //체력
//마법사의 기능(메서드)
void healing() { ++energy; } //체력회복 기술을 쓰는 메서드
}
class MagicianTest {
public static void main(String args[]) {
Magician magic; //Magician인스턴스를 참조하기 위한 변수 magic선언(아이디가 magic인 캐릭터 생성)
magic = new Magician(); //Magician인스턴스를 생성한다.
magic.level = 9; //Magician인스턴스의 멤버변수 level값을 9로 한다.
magic.healing(); //Magician인스턴스의 메서드 healing()을 호출한다.
System.out.println("현재 캐릭터의 레벨은" + m.level + "입니다.");
//현재 캐릭터의 레벨은 9입니다.
}
}
//첫번째 방법
Tv[] tvArr = new Tv[3];
tvArr[0] = new Tv();
tvArr[1] = new Tv();
tvArr[2] = new Tv();
//두번째 방법
Tv[] tvArr = new Tv(100);
for (int i = 0; i < tvArr.length; i++) {
tvArr[i] = new Tv();
}
class Time {
int hour;
int minute;
float second;
}
<클래스 영역>
인스턴스변수
: 멤버변수 중 static이 붙지 않은 것
: 독립적인 저장공간을 가지므로 서로 다른 값을 가질 수 있다.
클래스변수
: 멤버변수 중 static이 붙은 것
: 모든 인스턴스가 공통된 저장공간(변수)을 공유한다. 따라서 한 클래스의 모든 인스턴스들이 공통적인 값을 유지해야하는 속성을 가진다.
<클래스 영역 이외의 영역>
class Variables {
//클래스 영역
int iv; //인스턴스 변수
static int cv; //클래스 변수
void method() {
//메서드 영역
int lv = 0; //지역변수
}
}
변수의 종류 | 선언위치 | 생성시기 |
---|---|---|
클래스 변수 | 클래스 영역 | 클래스가 메모리에 올라갈 때 |
인스턴스 변수 | 클래스 영역 | 인스턴스가 생성되었을 때 |
지역변수 | 클래스 영역 이외의 영역(메서드, 생성자, 초기화 블럭 내부) | 변수 선언문이 수행되었을 때 |
class Card {
//인스턴스변수(무늬, 숫자): 자신만의 무늬와 숫자 유지
String kind;
int number;
//클래스변수(폭, 넓이): 모든 카드가 같은 값을 유지
static int width = 100;
static int height = 250;
}
int add(int a, int b) //선언부
{ //구현부
int result = a + b;
return result;
}
메서드이름(값1, 값2,..)
클래스 파일을 읽어서 분석하여 클래스에 대한 정보(클래스 데이터)를 이곳에 저장한다. 이 떄, 클래스변수도 이 영역에 함께 생성된다.
2. 힙인스턴스가 생성되는 공간. 인스턴스변수들이 생성되는 공간.
3. 호출스택메서드 작업에 필요한 메모리 공간을 제공한다.
자바에서는 메서드를 호출할 때 매개변수로 지정한 값을 메서드의 매개변수에 복사해서 넘겨준다.
void method() {
method(); //재귀호출. 메서드 자신을 호출한다
}
같은 클래스에 속한 멤버들 간에는 별도의 인스턴스를 생성하지 않고도 서로 참조 또는 호출이 가능하다. 단, 클래스멤버가 인스턴스 멤버를 참조 또는 호출하고자 하는 경우에는 인스턴스를 생성해야 한다. 왜냐하면 인스턴스 멤버가 존재하는 시점에 클래스 멤버는 항상 존재하지만, 클래스멤버가 존재하는 시점에 인스턴스 멤버가 존재하지 않을 수도 있기 때문이다.
long add(int a, long b) {
return a + b;
}
long add(long a, int b) {
return a + b;
}
기존에는 메서드의 매개변수 개수가 고정적이었으나, JDK1.5부터 동적으로 지정해줄 수 있게 되었으며, 이 기능을 '가변인자'라고 한다. 가변인자 외에도 매개변수가 더 있다면 가변인자를 제일 마지막에 선언해야한다.
//가변인자는 '타입... 변수명'과 같은 형식으로 선언
public PrintStream printf(String format, /*가변인자:*/Object... args) {...}
class Card {
Card() { //매개변수가 없는 생성자
//...
}
Card(String k, int num) { //매개변수가 있는 생성자
//...
}
클래스 이름() { }
Card() { }
Magician m = new Magician ();
m.hair = "white";
m.gender = "female";
Magician m = new Magician("white, "female");
[연습문제 참고]
다음과 같이 정의된 메서드를 작성하고 테스트하시오.
메서드명 : Ascending
기능: 주어진 배열에 담긴 값을 오름차순으로 정렬한다. (for문 사용)
반환타입 : int[]
매개변수 : int[]arr - 정수값이 담긴 배열
class Exercise6_20
{
/*
(1) Ascending 메서드를 작성하시오
public static int[] Ascending(int[] arr) {
if (arr == null || arr.length == 0)
return arr;
for (int i = 0 ; i < arr.length; i++) {
for (int j = i + 1; j < arr.length; j++) {
if (arr[i] > arr[j]) {
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
}
}
return arr;
}
*/
public static void main(String[] args)
{
int[] original = {3, 2, 1, 5, 8, 6, 9, 7, 4};
System.out.println(java.util.Arrays.toString(original));
int[] result = Ascending(original);
System.out.println(java.util.Arrays.toString(result));
}
}