본문 바로가기
Backend

05월 29일 수 | OOP 10 - JAVA의 Class와 접근제한자

by 구라미 2019. 5. 29.

9. 객체지향 프로그래밍 Ⅰ

클래스

클래스는 단위.

우리가 매일 만드는 Test01 이런 것도 클래스

클래스 안의 클래스 -> 내부클래스 *안드로이드에서 쓰임 활용도가 그렇게 높지 않음~

 

실행클래스: main()을 포함하는 클래스, 실행클래스가 제일 먼저 메모리에 로드되어 실행된다.

멤버클래스: 실행클래스가 아닌 다른클래스들

인스턴스: 클래스를 사용하려면 클래스를 객체로 만들어야한다. 그 객체로 만든는 작업을 인스턴싱, 특정 클래스로부터 만들어진 객체를 그 클래스의 인스턴스라고 한다.

 

*C언어: 구조체(Struct), 공용체(Union) 구조체 공용체에는 //변수로 구성되어 있다.

*Java: Class 는 함수도 올 수 있음 //변수와 함수로 구성되어있다.

 

자바클래스의 구성

변수(field) + 함수(method)

멤버변수(field) + 멤버함수(method)

 

동일한 함수명 중복해서 쓰기 -> 오버로딩

부모로부터 물려받은 함수를 고쳐서 쓰기 -> 오버라이딩

 

변수 설계 - 생성자(constructor) 설계 - 함수 설계

 

클래스명 (식별자 특징 확인)

클래스명의 첫 글자는 반드시(되도록) 대문자로 만든다.

 

접근허용범위 Access Modifier

클래스 접근을 어디까지 허용하는가에 대한 것이다.

-접근지정, 접근제어, 접근수정이 라고도 한다.

-private       : 비공개

-package    : 생략가능 , 루나 이전버전 default라고 했었다. = 같은 폴더

-protected : package와 public의 중간 느낌 // 다른 패키지에 있는 클래스라도 상속관계 있는 클래스 라면 접근가능

-public         : 공개

이렇게 4종류가 있다.

 

Sungjuk클래스는 package가 생략되어 있으므로

->oop0529 패키지내에서만 접근 가능하다.

 

접근할 때 정리를 잘 해주어야 유지보수 잘할수 있다.

 

package oop0529;

class Sungjuk { //클래스명 식별자 특징
	
	//멤버변수(field) 선언: column, property 속성
	public String name; //public이라 어디서든 접근가능
	public int kor, eng, mat;
	private int avg; //Sungjuk 클래스내에서만 접근가능
	
	//멤버함수 (method)
	public void calc(){ //접근제어 package 생략
		int avg; //지역변수
		avg = (kor+eng+mat)/3;
	}//calc() end
	
	public void disp(){
		System.out.println(name);
		System.out.println(kor);
		System.out.println(eng);
		System.out.println(mat);
		System.out.println(avg);		
	}//disp() end
	
}//class end

 

클래스는 메모리 할당을 한 후 사용해야한다.

new 연산자 : 메모리할당 연산자

new Sungjuk(); //객체(Object)

 

C언어는 메모리를 효율적으로 관리하도록 하는 연산자들이 있음.

Java는 가비지 콜렉팅으로 알아서 해준다.

 

메모리에 공간확보 / 이렇게 할당 받은 공간을 객체라고 한다.

주소값을 끌어오는 것을 참조변수라고 한다.

클래스는 우리가 필요에 의해 만든 자료형 , 사용자 정의 자료형

 

Static Area 스태틱 메모리 영역

하나의 자바파일은 필드,생성자,메소드로 구성된다.

그 중 필드 부분에서 선언된 변수(전역)와 정적 멤버변수(static이 붙은 자료형) Static 영역에 데이터를 저장한다.

Static 영역의 데이터는 프로그램의 시작부터 종료까지 메모리에 남아있게 된다.

 

Stack Area 스택 메모리 영역

메소드 내에서 정의하는 기본 자료형(int, double, byte, long, boolean 등) 에 해당되는

지역변수 (매개변수 및 블럭문 내 변수 포함)의 데이터의 값이 저장되는 공간이 Stack영역이다.

해당 메소드가 호출될 때 메모리에 할당되고 종료되면 메모리가 해제된다.

 

Heap Area 힙 메모리 영역

인스턴스를 생성하는 방법은 "클래스 변수 = new 클래스();"

참조형(Reference Type)의 데이터 타입을 갖는 객체(인스턴스), 배열 등은 Heap 영역에 데이터가 저장된다. 

이때 변수(객체, 객체변수, 참조변수)는 Stack 영역의 공간에서 실제 데이터가 저장된

Heap 영역의 참조값(reference value, 해시코드 / 메모리에 저장된 주소를 연결해주는 값)을 new 연산자를 통해 리턴 받는다. 

다시 말하면 실제 데이터를 갖고 있는 Heap 영역의 참조 값을 Stack 영역의 객체가 갖고 있다. 이렇게 리턴 받은 참조 값을 갖고 있는 객체를 통해서만 해당 인스턴스를 핸들 할 수 있다.

 

//출처 : http://blog.naver.com/PostView.nhn?blogId=heartflow89&logNo=220954420688

 

 

*kim. <- .을 쳤을 때 여러 옵션이 나오는 것은 kim이 단순 변수가 아니라 어떠한 주소를 참조하는 변수이기 때문이다.

 

int a = 3; //정수형 a변수가 메모리 4byte 할당.
//new 연산자  :  메모리할당 연산자		
		
//kim은 Sungjuk의 주소를 참조하는 변수
//Sungjuk이라는 클래스(사용자가 만든 자료형)을 받아옴, 그리고 객체할당
Sungjuk kim = new Sungjuk(); 
Sungjuk lee = new Sungjuk();
	
//객체의 주소값
System.out.println(kim.hashCode());
System.out.println(lee.hashCode());
		
//kim의 주소값: 366712642
//lee의 주소값: 1829164700

//변수에 변수를 담듯 객체를 담을 수 있다.

Sungjuk park = lee;		
System.out.println(park.hashCode());
//park의 주소값: 1829164700  :lee의 주소값과 같다.

이런 식으로 사용한다.

package oop0529;

class Sungjuk { //클래스명 식별자 특징
	
	//멤버변수(field) 선언: column, property 속성
	public String name; //public이라 어디서든 접근가능
	public int kor, eng, mat;
	private int avg; //Sungjuk 클래스내에서만 접근가능 (같은 클래스 내에서만 접근가능)
	
	//멤버함수 (method)
	public void calc(){ //접근제어 package 생략
		//int avg; //지역변수
		avg = (kor+eng+mat)/3;
	}//calc() end
	
	public void disp(){
		System.out.println(name);
		System.out.println(kor);
		System.out.println(eng);
		System.out.println(mat);
		System.out.println(avg);		
	}//disp() end
	
}//class end


//------------------------------------------------------------------------

public class Test01_Class {

	public static void main(String[] args) {
		// class
		
//int a = 3; //정수형 a변수가 메모리 4byte 할당.
//new 연산자  :  메모리할당 연산자		
//		
//kim은 Sungjuk의 주소를 참조하는 변수
//Sungjuk kim = new Sungjuk(); //객체(Object) Sungjuk이라는 클래스(사용자가 만든 자료형)을 받아옴, 그리고 새로 객체할당  
//Sungjuk lee = new Sungjuk(); //Sungjuk이라는 클래스(사용자가 만든 자료형)을 받아옴, 그리고 새로 객체할당 
//		
////객체의 주소값
//System.out.println(kim.hashCode());
//System.out.println(lee.hashCode());
//		
//kim의 주소값: 366712642
//lee의 주소값: 1829164700
//
//변수에 변수를 담듯 객체를 담을 수 있다.
//
//Sungjuk park = lee;		
//System.out.println(park.hashCode());
//park의 주소값: 1829164700  :lee의 주소값과 같다.

		
//------------------------------------------------------------------------
		Sungjuk kim = new Sungjuk();
		kim.name = "손흥민";
		kim.kor = 95;
		kim.eng = 70;
		kim.mat = 55;
		//kim.avg = 70; 에러, private 속성은 접근 불가능
		System.out.println(kim.name);
		System.out.println(kim.kor);
		System.out.println(kim.eng);
		System.out.println(kim.mat);
		
		kim.calc(); //이 함수 부르면 평균값 나옴.
		kim.disp(); //이 함수 부르면 syso값 나옴.
		
		Sungjuk lee = new Sungjuk();
		lee.name = "박지성";
		lee.kor = 100;
		lee.eng = 85;
		lee.mat = 70;
		
		lee.calc();
		lee.disp();

		
		
	}//main end
}//class end

결과값

손흥민
95 
70
55
73
박지성
100
85
70
85

 

 

멤버변수 field

새로운 클래스를 만들었다.

basicJava(프로젝트) 안에서 다 쓸 수 있다.

대부분의 멤버변수를 private로

자바의 특징 자료를 은폐

//멤버변수 field
private String name;
private int kor, eng, mat;
private int avg;

멤버함수 method

새로운 클래스를 만들었다.

basicJava(프로젝트) 안에

//멤버함수 method
	public void init(String n, int k, int e, int m){
		name = n ;
		kor = k;
		eng = e;
		mat = m;
		
}//init end

만들었다

만들었다만들었다

만들었다

 

생성자 Constructor

생성자 함수(constructor)

-> new연산자와 함께 메모리를 할당하는 경우 호출

-> class 이름과 동일한 함수

-> 기본생성자 함수는 : 매개변수가 없다.

-> 함수가 자동추가된다.

-> 생성자 함수도 오버로딩이 가능하다. (생성자함수를 여러개 만들 수 있다)

-> (단, 기본생성자함수는 생성자 함수가 오버로딩이 되면 자동추가 되지 않으므로 강제적으로 선언할 것을 강추!!!!)

 

생성자 함수를 private으로 싱글톤 코딩 -> 보안을 강화한 코딩

 

소멸자 함수(destructor) : 자바에는 없음
가비지 콜렉팅 (garbage collecting)은 JVM이

가비지 콜렉터라는 인스턴스 자동해제(메모리반환) 시스템을

가동시켜 필요한 메모리를 관리한다.

 

java.lang package 안의 클래스는 기본이라 import 안해도 부를 수 있음.

 

This

자기 자신을 가리키는 클래스

일반변수와 멤버변수를 구분하기 위함

this(); //생성자 함수 간의 호출

변수가 여러 개 있을 때 우선순위는 지엽적인 것 부터.

지역, 멤버, 상속

 

package oop0529;

class Jumsu { //package생략, oop0529패키지 내에서만 접근
	
	private String name = "손흥민";
	private int kor,eng, mat;
	private int avg;
	
	public Jumsu(){//default 생성자 함수
		
	}
	public void disp(){
		String name = "박지성"; //위의 손흥민 이름과 비교했을 때 우선순위가 더 높음
		//disp 메소드에서 선택권이 늘어남.
		System.out.println(name);
		System.out.println(this.name);
	}
	
}

public class Test03_This {

	public static void main(String[] args) {
		//This
		//this(); 
		Jumsu one = new Jumsu();
		one.disp();		

		
	}//main end
}//class end

syso name -> 박지성 //일반지역변수

syso this -> 손흥민 //멤버변수

 

 

생성자함수 자동추가

생성자함수는 타이핑하지 말고 메뉴로 추가

source > constructor

 

1) ...from Superclass ->기본 생성자 자동추가

 

설정해준 뒤 ok

 

자동으로 생성되었음.

 

2) ...using Fields -> 매개변수가 있는 생성자함수 자동추가

name만 체크한 경우 나오는 결과이다.

ㅏㅏㅏ

 

기본 클래스

java.lang <- 자바의 기본클래스 패키지

java.util

java.sql

 

기본클래스: 주로 java.lang 패키지에 있음

Math 클래스

수학연산해주는 여러 클래스가 있다.

난수값을 만들어주는 random()도 이 안에 있음.

 

Integer 클래스

toString() -> String으로 형변환

intValue() -> int로 형변환

parseInt(String s) -> 10진 정수로 형변환

//"4" -> 4 이렇게 형변환하는 경우가 매우 많다.

프로그래밍을 하면서 변환작업을 굉장히 많이 하게 된다. 그러므로 잘 숙지하고 있어야함.

 

 

이 부분은 다시 한번 확인해보자...

		//Math 클래스
//		System.out.println(Math.E);
//		System.out.println(Math.PI);
		
		//Integer 클래스
		Integer a = new Integer(5); //참조형
		Integer b = new Integer("7"); //참조형 String 7이 들어와도 정수로 자동 형변환해준다.
		
		System.out.println(a.toString()); //String 형변환되었기 때문에 "5" 라는 뜻이다.
		System.out.println(b.intValue()); //int 형변환되었기 때문에 정수 7이라는 뜻이다.
		
		int c = 3; //기본형
				
		//문자열안에 있는 숫자기호를 정수형변환
		//"4" -> 4
		System.out.println(Integer.parseInt("4"));
		System.out.println("2"+"6"); //"26"
		System.out.println(Integer.parseInt("2")+Integer.parseInt("6")); //8		
		
		//NumberFormatException 발생
		System.out.println(Integer.parseInt("soldesk"));
		
		//이것도 안된다. 공백때문에
		System.out.println(Integer.parseInt("  4  "));

 

String 클래스

정말 중요한 가장 많이 쓰이는 클래스이다.

String name = new String("HAPPY");
String str = "HAPPY";

위의 것이 기본형이지만 정말 많이 쓰이기 때문에

밑에 것도 자주 쓰임.

 

//String 클래스
String name = new String("HAPPY");	
String str = "HAPPY";
		
if(name==str){
	System.out.println("같다");
}else{
	System.out.println("다르다");
}
		
//문자열의 내용을 비교하는 경우 
//같다연산자 (==)를 사용하지 말고
//equals()함수를 사용할것

 

댓글