<meta name="facebook:title" content="자바 배열">
<meta name="facebook:description" content="자바의 정석책을 참고하여 요약한 JAVA 객체지향 개념">
<meta name="facebook:domain" content="http://shj7242.github.io/2017/08/22/JAVA3/">
</head>
2017 - 08 - 22 (화)
참고 도서 : 자바의 정석(남궁성 저, 도우출판)
1 . 객체 지향 언어
객체지향 언어의 장점
▶ 코드의 재사용성이 높다.
▶ 새로운 코드를 작성할 때 기존의 코드를 이용하여 쉽게 작성할 수 있다.
▶ 코드의 관리가 용이하다.
▶ 코드간의 관계를 이용해서 적은 노력으로 쉽게 코드를 변경할 수 있다.
▶ 신뢰성이 높은 프로그래밍을 가능하게 한다.
▶ 제어자와 메서드를 이용해서 데이터를 보호하고 올바른 값을 유지하도록 하며, 코드의 중복을 제거하여 코드의 불일치로 인한 오동작을 방지할 수 있다.
1 . 클래스와 객체
클래스 : 객체를 정의해 놓은 것이며 객체를 생성하는데 사용된다.
객체 : 클래스에의해 정의되며 같은 클래스에 의해 정의된 객체는 같은 속성들을 가지고 있다.
클래스는 변수와 메서드로 구성되어 있으며 이 클래스의 객체를 생성하여 변수와 메서드를 사용할 수 있다.
2 . 변수와 메서드
선언 위치에 따른 변수의 종류와 범위
class test{
int iv; // 전역 변수 (인스턴스 변수) -- 인스턴스가 생성될 때 생성된다.
static int cv; //클래스 변수 -- 클래스가 메모리에 올라갈 때 생성된다.
void method(){
int lv = 0; // 지역변수 -- 변수 선언문 수행시 생성된다. 즉, 메서드가 실행되야함.
}
}
인스턴스 변수 : 객체생성시 참조변수(객체명).인스턴스변수로 접근한다. 참조변수가 없을 때 가비지 컬렉터에 의해 자동제거됨
클래스 변수 : 클래스명.클래스변수명 으로 접근가능하다. 같은 클래스의 모든 인스턴스들이 공유하는 변수이다.
지역변수 : 메서드 내에 선언되어 메소드 종료와 함께 소멸된다. for문이나 if 문등 반복/제어문 안에서 생성된 변수는 블록이 종료되는 시점에 소멸한다.
* 인스턴스 변수는 인스턴스가 생성될 떄마다 생성되므로 인스턴스마다 각각 다른 값을 유지할 수 있지만 클래스 변수는 모든 인스턴스가 하나의 저장공간을 공유하므로 항상 공통된 값을 가진다.
메서드 : 작업을 수행하기 위한 명령문의 집합
void method(){ System.out.println("abc"); } //반환타입이 없을 때 void 를 사용한다. abc라는 문장을 시스템에 출력하는 메소드
String method(){
String a = "abc";
return a;
}// 반환타입이 String이면 String값을 반환해야한다. 즉, 반환타입이 int 일 경우 int 를 반환해야함.
Student method(){
String id = "heejun";
String pw = "1234";
Student student = new Student(id, pw);
return student;
}// 객체 타입으로 반환할 수도 있다.
String method(Student student){
String id = student.getId();
return id;
}// 매개변수를 받는다. 위의 경우 매개변수를 Student형태의 student객체를 받아와 이 객체의 Id값을 가져와 lv에 넣어 이 lv 를 반환한다.
메서드의 종류
클래스 메서드(static이 붙어있는 메서드) : 인스턴스와 관계없는(인스턴스 변수나 인스턴스 메서드를 사용하지 않는) 메서드. 객체를 생성하지 않고 클래스이름.메서드이름(매개변수)으로 호출 가능. 그러나 클래스 변수가 호출되었을 때 인스턴스가 생성되어있지 않았을 수도 있으므로 클래스 변수는 인스턴스 메서드를 호출하는 것을 금지해 놓았다.
인스턴스 메서드(static이 없는 메서드) : 인스턴스 변수와 관련된 작업을 하는, 즉 메서드의 작업을 수행하는데 인스턴스 변수를 필요로 하는 메서드. 객체를 생성해야만 호출 가능. 인스턴스 메서드 안에서 인스턴스 메서드 및 클래스 메서드를 호출 할 수 있다.
JVM의 메모리 구조
메서드 영역 : 클래스 정보와 클래스 변수가 저장되는 곳이다.
호출 스택 : 메서드의 작업공간으로 메서드가 호출되면 메서드 수행에 필요한 메모리 공간을 할당받고 메서드가 종료되면 사용하던 메모리를 반환한다.
힙 영역 : 인스턴스가 생성되는 공간. new 연산자에의해서 생성되는 배열과 객체는 모두 이 곳에 생성된다.
CallStack 은 하나의 프로세스 내에서 생성된다. 예를들어 main문이 실행되고 이어서 다른 메소드가 호출되면 먼저 실행된 메소드의 수행을 멈추고 다음 메소드를 수행한다. 이렇게 Stack형태로 쌓이며 메소드의 수행을 완료하면 소멸한다. CallStack하나는 한개의 쓰레드라고 할 수 있다.
재귀호출 : 메서드 내에서 자기자신을 반복적으로 호출하는 것. 이해하기 쉽고 간결한 코드를 작성할 수 있다.
int factorial(int n){
int result = 0;
if(n==0){
result = 1;
}else{
result = n * factorial(n-1);
}
}
/*
int factorial(int n){
result = 1;
for(int i = n ; i=>0; i--){
result*=n;
}
return result;
}
*/
//본래 위와 같이 for문을 활용하여 factorial 메소드를 구현하였다. 위 방법 외에 재귀호출을 이용하여 간결한 코드로 factorial 메소드를 구현한다. 코드는 간결하나 사실상 메소드를 계속 호출하므로 성능은 더 좋지 않다.
메서드 오버로딩 : 하나의 클래스에 같은 이름의 메서드를 여러개 정의하는 것을 메서드 오버로딩 이라고 한다. 매개변수를 달리하여 같은 이름의 메소드를 여러개 사용한다. ex) println 메소드
오버로딩의 조건
- 메서드의 이름이 같아야 함.
- 메개변수의 개수 또는 타입이 달라야 함.
- 매개변수는 같고 리턴타입이 다른 경우는 오버로딩이 성립되지 않는다.
3 . 생성자
생성자 : 인스턴스가 생성될 때마다 호출되는 '인스턴스 초기화 메소드'이다.
* 모든 클래스에는 하나 이상의 생성자가 있어야한다.
this() , this : 생성자, 같은 클래스의 다른 생성자를 호출할 때 사용한다.
class Card{
int num;
String kind;
Card(){
this(9, "diamond"); // Card(int num, String kind) 생성자를 호출함.
} // 기본생성자 (default) 생성자
Card(int num, String kind){
this.num = num; // this는 해당 클래스의 인스턴스 변수를 카리킨다.
this.kind = kind;
}// 매개변수가 있는 생성자
}
객체 지향 개념 쉽게 이해하기
class Tv{
String color; // 인스턴스 변수 생성 및 자동초기화
int channel
Tv(String color , int channel){
this.color = color;
this.channel = channel;
} // 매개변수가 있는 생성자.
Tv(){} // default 생성자
void channelUp(){
channel++
}
void channelDown(){
channel--
} // 메서드생성
}
class TvTest{
public static void main(String args[]){
Tv t = new Tv();
Tv t1 = new Tv("red", 45); // 빨간색의 45번 채널이 틀어져있는 t1 이라는 Tv생성
t.color = "blue";
t.channel = 30; // t라는 Tv의 인스턴스 생성 및 t객체의 color 속성과 channel 속성에 blue, 30 값을 넣어줌
t.channelDown(); // t객체의 channel 값이 29로 내려감
t1.channelUp(); // t객체의 channel 값이 46으로 올라감.
}
}