클래스 기초
객체란?(1)
- 상태와 행동, 이 두 특성으로 표현되는 모든 대상들.- Software의 객체도 이와 유사함
- 객체생성을 위한 청사진(blueprint)이다.
- 클래스는 사용자 정의 타입이다.
객체란?(2)
- Software를 객체로 묶는 잇점- Modularity 모듈화 독립성 상승
- Information Hiding
- Code재사용
- Plugability와 Debuging이 쉬워짐
Class란?(3)
- 클래스의 3요소- 필드 - 속성 또는 상태를 저장하는 곳.==> 변수!
- 메서드 - 동작 또는 기능
- 생성자 - 필드 초기화
- 형식:[지정자]class클래스명{
[필드선언] //클래스/인스턴스변수
[메서드 정의]
[생성자 정의]
}
필드(1)==> 변수!
- 속성 또는 상태- 객체가 처리할 데이터를 저장하는 곳.
(1) 인스턴스변수
변수선언시,static지시자 없이 선언된다.
클래스를 객체화 할 때 마다 메모리에 새로 생성됨.
(2) 클래스변수 (또는 static변수)
변수 선언시, static으로 선언된다.
클래스가 업로드 될 때 메모리에 한 번 생성됨.
// 클래스 변수
// - 클래스에 static 으로 선언된 변수
// - 클래스가 메모리에 로딩될 때 준비된다.
// - 클래스의 모든 메서드가 접근 가능.
// - 만약 해당 변수가 public, (default), protected로 공개되었다면,
// 그 조건에 맞추어 다른 클래스에서 접근할 수 있다.
// static 블럭
// - 클래스가 로딩되고 난 후 사용되기 전에 필요한 값을 준비하는 블럭
// - 스태틱 블럭에서는 스태틱 변수와 스태틱 메서드만 사용가능. 인스턴스 변수/메서드 접근 불가!
// - 클래스가 로딩되고 난 후 즉시 딱 한 번 이 블럭을 수행한다.
static {
scanner = new Scanner(System.in);
}
public class CalculatorView02 {
public static void inputForm() {
// 로컬변수
// - 메서드 및 블럭 안에 선언된 변수
// - 해당 블럭 내에서만 사용 가능
// - 메서드의 변수는 메서드의 블럭 안에서는 사용가능
// - 메서드 안에 선언된 모든 로컬 변수는 다른 메서드에서 사용 불가능
int result = 0;
...
}
}
- 인스턴스변수
- static이 붙지않은 멤버변수
- 객체가 생성될때
- 객체마다 독립적인 공간에 존재
- 인스턴스 고유의 상태를 유지해야 되는 경우에 사용
- 객체를 생성한후, Object reference(객체의레퍼런스)를 통해서 접근
- 형식 - [접근 지정자] 데이터형 변수명;//초기값으로 자동으로 초기화
- cf) 로컬변수는 자동 초기화 안됨
- 인스턴스화 : 개별적으로 관리되어야 할 값은 인스턴스 변수에 저장해야 한다.
인스턴스 변수는 static 을 제외한다. static은 공유되는 영역으로 동시에 개별적으로 값을
입력받거나 할 수 없다. 이럴 때는 인스턴스화 시켜야 한다.
- 클래스변수
- static으로 선언되며 모든 객체가 공유
- 클래스가 메모리에 올라갈때
- 인스턴스를 생성하지 않고 사용가능.
- 공통적인 값을 유지해야 하는 속성의 경우에 사용
- 객체를 생성하지 않고도, 클래스명을 통해서 접근 => 공유(공통속성 저장유리)
- 형식 - [접근지정자] static데이터형 변수명;
- 로컬변수(지역변수)
- 메서드가 일시적인 상태를 저장하기 위해 선언된 변수
- 메서드의 블록내에서만 선언 및 접근가능.
객체의생성(1)
- 키워드 new와 함께 클래스의 생성자를 호출함- 생성자가 호출되면,객체 인스턴스가 메모리에 생성되고,
- 참조형 변수에 생성된 객체의 위치정보가 저장됨.
- 형식 - 클래스형 변수명 = new 클래스생성자([인자]);
객체의생성
- 키워드 new와 함께 클래스의 생성자를 호출
- 생성자가 호출되면, 객체 인스턴스가 메모리에 생성되고,
- 참조형 변수에 생성된 객체의 위치정보가 저장됨.
- 형식 - 클래스형 변수명 = new 클래스명([값]);- 참조형 변수에 생성된 객체의 위치정보가 저장됨.
변수명.필드명;
변수명.메소드명([값]);
- 객체의 멤버에 접근하기 위해서 변수명과 (.)을 사용함
(같은 클래스 내의 메소드 및 필드에 접근하기 위해서 this.(현재 객체를 의미)을 사용할 수 있음)
@교재실습.--P 145 147 148 151 AirCon/AirConUse/AirConUse2/VariableKind
- 인스턴스,static,local변수 관련
메서드(1)
- 행동을 표현- 작업을 수행하는 명령어들의 집합.
- 필드(멤버변수 또는 인스턴스 변수)에 저장된 데이터를 수정,조회하는 용도로 사용됨.
- 호출을 통해서 동작 -- 메소드는 호출. 필드(변수)는 정의.
- 모든 객체가 공유해서 사용.
메서드(2)
- 형식[지정자] 반환자료형 메서드명([매개변수선언]) {...//메서드가 처리하는 실행문.
[return 반환값]
}
- 메서드명은 동사형이며 소문자로 시작(규약)
- 호출시 전달받을 인자에 대한 매개변수의 선언은 변수 선언과 동일함
- 반환한 값이 있는 경우, 반환자료형을 지정.
반환자료형은, 기본자료형, 참조형(배열,클래스,인터페이스)이 모두 가능, 반환할 결과값이 없는 경우 void로 명명)
main 메서드
- 프로그램의 시작점인 메서드.JVM에 의해 가장 처음 호출된다.- 어플리케이션은 반드시 한개의 main메서드를 갖는다.
- 형식 - public static void main(String[] args) {
...
} 규칙!!!
클래스 메서드와 인스턴스 메서드
메서드 앞에- static이 붙으면 클래스메서드,
- static이 안붙으면 인스턴스 메서드.
- 클래스 메서드
- static으로 선언된 메서드
- 객체를 생성하지 않고, 클래스 이름을 통해서 호출할 수 있음.
- static변수만 사용 가능 (인스턴스 변수는 사용할 수 없다.)
- 인스턴스 메서드
- static이 붙지 않은 메서드
- 객체를 생성한 후,Object reference를 사용해서 호출할 수 있음
- static변수와 인스턴스 변수 모두 사용할 수 있다.
오버로딩(Overloading)
- 같은 이름의 메서드(또는 생성자)를 정의하는 것.
- 같은 이름으로 된 메서드 또는 생성자를
'오버로딩메서드' 또는 '오버로딩생성자'라고 함.
- 오버로딩(Overloading) 규칙
- 같은 이름으로 된 메서드 또는 생성자를
'오버로딩메서드' 또는 '오버로딩생성자'라고 함.
- 오버로딩(Overloading) 규칙
- 메서드(또는 생성자) 이름이 같아야 한다
- 매개변수들의 갯수,타입 또는 순서가 달라야 한다.
- (반환자료형은 영향을 주지 않는다.)
- 예) Overloading 메서드
public class MyMath {
public static short add(short a, short b) { return (short)(a+b); }
public static int add(int a, int b) { return (a+b); }//오버로딩 메서드
public static int add(int a, int b) { return (a+b); }//오버로딩 메서드
}
public int sum(int a, int b) {
return a+b;
}
public int sum(int a, int b, int c) {//갯수 다르게,(만약 같은 type의 같은이름 변수쓰면서 순서 바꾸면 동일하게 인식하여 err).
return a+b+c;
}
public short sum(short a, short b) {//type 다르게
return (short)(a+b);
}
//순서가 적용되는 경우
public int sum(int a,float f) {
return (int)(a+f);
}
public int sum(float f,int a) {//type이 다른경우 순서 변경시 다르게 인식.
return (int)(a+f);
}
@실습 - P166,164 : static과 instance메서드 관련
생성자
- 객체가 생성될때,멤버필드의 초기화 작업을 수행하는 메서드
- 클래스명과 동일한 이름을 가지며, 반환자료형 없음
- 형식-[접근지정자]생성자명([매개변수]) {
...
}
- 매개변수를 이용해서 멤버필드를 초기화하거나 그밖에 필요한 작업을 위하여 사용.
- 예) public class Member{
String namek
int age;
public Member(String name,int age) {
this.name = name; //멤버필드 name 초기화
this.name = age; //멤버필드 age의 초기화
}
}
this => 자신을 가리키는 레퍼런스 객체
(프로퍼티는 setter와 getter 메서드를 갖고있는 멤버필드)
- encapsulation 캡슐화에 유용
- setter와 getter 메서드의 이름은 다음같이 지정.
형식 : set + 프로퍼티명(또는 필드명)
get + 프로퍼티명(또는 필드명)//프로퍼티명의 첫글자는 대문자
예) 프로퍼티 age 에 대해, setAge(), getAge()
public class Student {
private String name;
public void setName(String n){
name = n;//프로퍼티네임의 setter
}
public String getName() {
return name;//getter
}
}
- 외부의 코드는 반드시 객체레퍼런스, 필드명을 사용해야 한다.
- 예)
Class Rectangle {
int width;
public Rectangle(int w) {
width=w; //내부에서 width필드의 접근.
}
}
Class B {
public static void main (String args[]) {
Rectangle rect = new Rectangle(100);// width 초기화
Int length = rect.width; // 외부에서 width 필드의 접근
}
}
- 객체 참조를 통한 instance필드의 효출은, 특정한 객체의 필드 호출을 의미한다.
- 그밖에, 객체의 접근을 위하여, new 연산자가 반환하는 object reference값을 바로 사용할 수 있다.
이 경우, 프로그램은 객체의 reference를 갖지 않게 되므로, 이 객체는 Garbage Collection의 대상이 된다.
예) int width = new Rectangle(100).width;//
- 클래스명과 동일한 이름을 가지며, 반환자료형 없음
- 형식-[접근지정자]생성자명([매개변수]) {
...
}
- 매개변수를 이용해서 멤버필드를 초기화하거나 그밖에 필요한 작업을 위하여 사용.
- 예) public class Member{
String namek
int age;
public Member(String name,int age) {
this.name = name; //멤버필드 name 초기화
this.name = age; //멤버필드 age의 초기화
}
}
this => 자신을 가리키는 레퍼런스 객체
기본생성자
- 매개변수가 없는 생성자
(컴파일러는 어떤 생성자도 존재하지 않는 경우에 empty인 기본생성자를 클래스에 자동으로 포함시킴)
- 형식-[접근지정자]생성자명() {}
(컴파일러는 어떤 생성자도 존재하지 않는 경우에 empty인 기본생성자를 클래스에 자동으로 포함시킴)
- 형식-[접근지정자]생성자명() {}
- 예) public class Member{
public Member(){
...
...
}
}
this() 생성자
http://jeami.tistory.com/entry/This
http://blog.daum.net/gunsu0j/334
- 생성자 안에서 다른 생성자를 호출할때 this()사용!.
이때는 생성자 block 내의 첫번째 구문(라인)이어야 함.
http://blog.daum.net/gunsu0j/334
- 생성자 안에서 다른 생성자를 호출할때 this()사용!.
이때는 생성자 block 내의 첫번째 구문(라인)이어야 함.
- 예) public class Member{
int id;
String name;
public Member(){
this.name=name;
}
public Member(int id,String name){
this(name);//this()이용해서 생성자 호출-블럭내 첫줄!
this.id = id;
}
/*
/*
public Member(int id,String name){ //같은내용
this.name=name;
this.id = id;
}
*/
*/
}
[this]-- 참조 변수 this인스턴스 자신을 가리키는 참조변수로 해당 인스턴스의 주소값을 가지고 있음.static에서 사용 불가.-- 생성자 참조 함수 this()같은 클래스 내의 다른 생성자를 참조할 때 사용.
초기화 블럭
- 복잡한 초기화 작업이 필요한 경우 초기화 블럭을 사용
- 클래스 초기화 블럭
- 클래스 초기화 블럭: 클래스변수의 초기화에 사용( static을 블럭앞에 붙임 )
- 클래스가 메모리에 처음 로드될때,한번만 수행됨.
- 인스턴스 초기화 블럭
- 인스턴스 변수의 초기화, 인스턴스 생성할 때마다 수행됨.
- 생성자들 공통으로 수행되는 작업을 인스턴스 초기화 블럭 에 넣는다.
필드의 초기화
- 멤버필드는 자동적으로 디폴트값으로 초기화
- 알고있는 특정한 값으로 초기화 가능.
- 멤버변수의 초기화 순서
public class InitTest {
// private static int a;// default 0
// private int b; //0
// private char c; // 0000
// private String s; //null
private static int a;
private int b;
private static int [] static_arr;
private int [] instance_arr;
private char c='A';
private String s="AAA";
//초기화블럭(static 클래스변수) : 로직이 필요한 초기화에 유용
static{
for (int i = 0; i < static_arr.length; i++) {
static_arr[i] = i*2;
}
}
//초기화블럭(인스턴스변수) : 로직이 필요한 초기화에 유용
{
for (int i = 0; i < static_arr.length; i++) {
static_arr[i] = i*2;
instance_arr[i] = i*10;
}
}
//생성자
public InitTest(int b){
this.b=b+instance_arr[0]+instance_arr[2];
}
}
@실습 - P169,171,174 - 클래스변수의 초기화 순서
- 기본값 초기화
- 명시적초기화
- 클래스 초기화 블럭 수행
- 인스턴스변수의 초기화 순서
- 기본값 초기화
- 명시적초기화
- 인스턴스 초기화 블럭
- 생성자(호출)
public class InitTest {
// private static int a;// default 0
// private int b; //0
// private char c; // 0000
// private String s; //null
private static int a;
private int b;
private static int [] static_arr;
private int [] instance_arr;
private char c='A';
private String s="AAA";
//초기화블럭(static 클래스변수) : 로직이 필요한 초기화에 유용
static{
for (int i = 0; i < static_arr.length; i++) {
static_arr[i] = i*2;
}
}
//초기화블럭(인스턴스변수) : 로직이 필요한 초기화에 유용
{
for (int i = 0; i < static_arr.length; i++) {
static_arr[i] = i*2;
instance_arr[i] = i*10;
}
}
//생성자
public InitTest(int b){
this.b=b+instance_arr[0]+instance_arr[2];
}
}
setter 메서드 와 getter 메서드
- 프로퍼티의 값을 설정하거나 읽기 위해서 사용.(프로퍼티는 setter와 getter 메서드를 갖고있는 멤버필드)
- encapsulation 캡슐화에 유용
- setter와 getter 메서드의 이름은 다음같이 지정.
형식 : set + 프로퍼티명(또는 필드명)
get + 프로퍼티명(또는 필드명)//프로퍼티명의 첫글자는 대문자
예) 프로퍼티 age 에 대해, setAge(), getAge()
public class Student {
private String name;
public void setName(String n){
name = n;//프로퍼티네임의 setter
}
public String getName() {
return name;//getter
}
}
1.객체의 필드의 참조
- 객체의 필드들은 필드명에 의하여 접근된다.- 외부의 코드는 반드시 객체레퍼런스, 필드명을 사용해야 한다.
- 예)
Class Rectangle {
int width;
public Rectangle(int w) {
width=w; //내부에서 width필드의 접근.
}
}
Class B {
public static void main (String args[]) {
Rectangle rect = new Rectangle(100);// width 초기화
Int length = rect.width; // 외부에서 width 필드의 접근
}
}
- 객체 참조를 통한 instance필드의 효출은, 특정한 객체의 필드 호출을 의미한다.
- 그밖에, 객체의 접근을 위하여, new 연산자가 반환하는 object reference값을 바로 사용할 수 있다.
이 경우, 프로그램은 객체의 reference를 갖지 않게 되므로, 이 객체는 Garbage Collection의 대상이 된다.
예) int width = new Rectangle(100).width;//
댓글 없음:
댓글 쓰기