11. JAVA, 클래스 (class, OOP, new 연산자, 객체, 인스턴스, this, 내부클래스)
○ 객체지향 프로그래밍(OOP: Object-Oriented Programming)
- 모든 데이터를 객체(object)로 취급
- 클래스(class) : 객체를 정의하는 설계도, 객체지향 언어에서 가장 핵심적인 개념
- 특징
① 정보 은닉/은폐 (information hiding)
② 캡슐화 (encapsulation)
③ 상속 (inheritance) → 관련 포스팅
④ 다형성 (polymorphism) → 관련 포스팅
⑤ 추상화 (abstraction) → 관련 포스팅
○ 클래스(class)
- 구성 멤버 : 멤버변수(field)+ 멤버함수(method)
- 클래스 명의 첫 글자는 대문자로
- 클래스를 사용하려면 메모리를 할당하고 사용한다 (new 연산자 사용/ 아래 내용 참고)
- 클래스는 참조 자료형(Reference)이다 (참고: JAVA 자료형)
class Sungjuk{
//멤버변수 field
public String name;
int kor, eng, mat;
private int aver;
//멤버함수 method
private void view() { }
void calc() { aver=(kor+eng+mat)/3; }
public void disp() {
System.out.println(name);
System.out.println(kor);
System.out.println(eng);
System.out.println(mat);
System.out.println(aver);
}//disp() end
}//class end
○ new연산자
- new 연산자를 이용하면 RAM(Random Access Memory)의 heap영역에 메모리가 할당되고 주소값이 발생된다
- 형식) new 클래스명();
- 이렇게 선언된 것을 객체(object)라고 하며, 메모리에 할당된 객체를 인스턴스(instance)라고 부른다
- 클래스로부터 객체를 선언하는 과정을 클래스의 인스턴스화라고 함
- . 연산자 : 참조변수를 통해 객체에 접근하는 연산자
Sungjuk sj = new Sungjuk(); //sj: 참조변수 → heap에 할당된 Sungjuk()의 주소를 기억
sj.name="손흥민"; //sj의 주소에 가서 name에 "손흥민"을 저장
sj.kor=95;
sj.eng=80;
sj.mat=85; //sj의 주소에 가서 kor, eng, mat에 각각 값 저장
sj.aver; //에러, private속성은 class외부에서 접근 불가능
sj.calc(); //aver=(95+80+85)/3=86
sj.disp(); //출력 결과 >> 아래 그림 참고
sj.view(); //에러, private속성은 class외부에서 접근 불가능
- 참조변수가 갖고 있는 객체의 주소값 확인 : hashCode() 함수
System.out.println(sj.hashCode()); //1651191114
Sungjuk tmp=sj;
System.out.println(tmp.hashCode()); //1651191114 : tmp는 sj의 주소값을 그대로 받아옴
tmp.disp(); //손흥민, 100, 95, 90, 95
○ this
- 클래스가 자신을 가리키는 대명사
- 일반 지역변수와 멤버변수를 구분하기 위해 쓰임
- this() → 자신의 생성자 함수를 호출
package oop0406;
class Score{
//멤버변수 field
private String name="손흥민";
private int kor, eng, mat;
private int aver;
//생성자함수 constructor
public Score() {
this(); //자신의 생성자함수 호출 → Score(); 에러
}
public Score(String name, int kor, int eng, int mat) {
//this.멤버변수=지역변수
this.name=name;
this.kor=kor;
this.eng=eng;
this.mat=mat;
this.aver=(kor+eng+mat)/3;
}
//멤버함수 method
public void disp() {
//지역변수의 우선순위가 가장 높다(박지성)
String name="박지성";
System.out.println(name); //박지성
System.out.println(this.name); //손흥민
System.out.println(this.kor);
System.out.println(this.eng);
System.out.println(this.mat);
System.out.println(this.aver);
}
}//class end
public class Test04_this {
public static void main(String[] args) {
Score one = new Score();
one.disp(); //박지성, 손흥민, 0, 0, 0, 0
Score two = new Score("김연아", 50, 60, 75); //객체배열
two.disp(); //박지성, 김연아, 50, 60, 75, 61
}//main() end
}//class end
○ 내부 클래스 (inner class)
- 클래스 내부에서 선언된 클래스
- 내부클래스는 직접 접근할 수 없다
- 내부클래스는 외부에서 단계적으로 접근할 수 있다
class WebProgram {
String title="Java Program";
class Language {
String basic="JAVA, HTML, CSS, JavaScript";
void display() {
System.out.println("기초수업: " + basic);
}
}//inner class
class Smart {
String basic="Objective-C, Java OOP, C#";
void display() {
System.out.println("기초수업: " + basic);
}
}//inner class
public void print() {
Language lang = new Language();
lang.display();
Smart sm = new Smart();
sm.display();
}//print() end
}//class end
public class Test10_inner {
public static void main(String[] args) {
WebProgram web = new WebProgram();
web.print();
// Language lang = new Language(); 에러, 내부클래스 직접 접근 불가
// Smart sm = new Smart(); 에러, 내부클래스 직접 접근 불가
// 내부클래스는 외부에서 단계적으로 접근할 수 있다
Language lang = new WebProgram().new Language();
lang.display();
Smart sm = new WebProgram().new Smart();
sm.display();
}//main() end
}//class end