Backend/JAVA_Basic

11. JAVA, 클래스 (class, OOP, new 연산자, 객체, 인스턴스, this, 내부클래스)

개발개발빈이 2022. 5. 31. 20:27

○ 객체지향 프로그래밍(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외부에서 접근 불가능

sj.disp(); 출력결과

    - 참조변수가 갖고 있는 객체의 주소값 확인 :  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