본문 바로가기

국비과정/JAVA

20230620 _[13일차]_01. 접근제어자

[ 클래스의 접근제어 ] _ public 

package inheritance;

class Apple{	// 디폴트 패키지 생성

}


public class Inheritance {

	public static void main(String[] args) {
		Apple a = new Apple();	// 같은 패키지 내에서는 사용가능
        
	}
}

package access;

import inheritance.Apple;
import inheritance.Inheritance;

public class AccessModifier {

	
	public static void main(String[] args) {
    
		// 다른 패키지에 있는 클래스를 호출합니다.
        
		Inheritance i = new Inheritance(); // 다른 패키지여도 public 클래스여서 불러올 수 있음

//		Apple a = new Apple();		// 다른 패키지의 디폴트 클래스여서 못불러옴
						// public class Apple 이면 가능
	
	}

}

* public 유무 차이 **


[ 생성자의 접근제한 ]  _ static

package inheritance;


class Apple{
	int number;
	private int number2;
	private String name;
	


	private Apple() {	//  private 접근제한
		
	}
	
	static Apple getInstence() {	// *
		return new Apple();
	}

}


public class Inheritance {	
	public static void main(String[] args) {
		
//		Apple a = new Apple();		
// 		생성자 Apple이 private이여서 불가능  --> 접근을 위해 getInstence() 메소드 이용.

		Apple a = Apple.getInstence();
//		객체생성 이후 사용가능, 현재 객체생성x
				
		
	}
}

* Apple 클래스의 static Apple getInstence() 메소드에 static 붙여줬기 때문에 

  Apple a = Apple.getInstence();  --> main메소드에서 불러오기 가능! 


[ 필드의 접근제한 ]  _ private

package inheritance;


class Apple{
	int number;
	private int number2;
	private String name;
	
    
	private Apple() {
		
	}
	
	static Apple getInstence() {
		return new Apple();
		
	}
	
}


public class Inheritance {	
	public static void main(String[] args) {
		
//		Apple a = new Apple();
		Apple a = Apple.getInstence();
				
		a.number = 10;
//		a.number2 = 11;	// 변수number2가 private 이라 접근불가 
// 				--> getter/setter 이용 (우회접근)
		
	}
}

package inheritance;


class Apple{
	int number;
	private int number2;
	private String name;
	


	private Apple() {
		
	}
	
	static Apple getInstence() {
		return new Apple();
		
	}
	
	public int getNumber2() { 	// getter _get + 변수명
		return number2;
	}

	public void setNumber2(int number2) { 	// setter _set + 변수명으로 자동생성
		if(number2 > 100) {
			number2 = 50;
		}
		this.number2 = number2;
	}
	
}


public class Inheritance {	
	public static void main(String[] args) {
		
//		Apple a = new Apple();
		Apple a = Apple.getInstence();
				
		a.number = 10;
//		a.number2 = 11;
		
		a.setNumber2(150);	// **
		System.out.println(a.getNumber2());	// 50
	
	}
}

**  private number2 에 직접적으로 접근하지 못해서 일단 setter 메소드(setNumber2)를 통해 접근.

setter 를 통해 값을 넣어주고 getter가(getNumber2) 값을 받아 보이지 않는 내부에서 처리.


package inheritance;


class Apple{
	int number;
	private int number2;
	private String name;
	


	private Apple() {
		
	}
	
	static Apple getInstence() {
		return new Apple();
		
	}
		
	public String getName() {	
		return name;
	}

	public void setName(String name) {
		if(name.equals("바보") || name.equals(null)) {
			name = "춘식이";
		}
		this.name = name;
	}

	
}


public class Inheritance {	
	public static void main(String[] args) {
		
//		Apple a = new Apple();
		Apple a = Apple.getInstence();
				
		a.number = 10;
//		a.number2 = 11;
		
		a.setName("null");	// setName(String name)스트링을 받으니까 "" 로 넣어줘야함
		System.out.println(a.getName());	// null
        
		a.setName("바보");
		System.out.println(a.getName());	// 춘식이
		

	}
}

[ 다른패키지 + 상속관계 접근제한 ]

 

package inheritance;

> Class Mother

> public class parent

package inheritance;

class Mother{
	
	
}

public class Parent {
	public int number1;
	protected int number2;
	int number3;
	private int number4;
}

package access;

> public class Child extends Parent

> void print() 

package access;

import inheritance.Parent;
// 상속으로 연결합니다.
// 부모의 코드 자식이 자신의 것처럼 활용 => 중복코드 제거해서 코드량 줄이기 위해서



public class Child extends Parent{
	void print() {
    
		System.out.println(number1);
        
	}  
    
    // number1 => public 가능
    // number2 => protected 지만 상속관계여서 가능, 상속관계가 끊기면 불가능
    // number3 => defalt 불가능 
    // number4 => private 불가능
}

[ static ]

static은 정적이라는 의미를 가지고 있습니다.

자바에서는 정적 개념과 동적 개념이 있습니다.

쉽게 표현하면 정적은 클래스가 로드되는 시점입니다.

동적은 로드된 클래스가 실행된 이후를 말합니다.

 

이 중 객체는 동적 데이터라고 해서 프로그램이 실행된 이후에

발생되는 대표적인 형태입니다.

 

클래스를 정의할 때 static 키워드를 사용한 프로퍼티와

메소드는 해당 클래스의 인스턴스를 생성하지 않아도

접근할 수 있게 됩니다.

이러한 프로퍼티와 메소드를 정적 멤버( static member )라고 합니다.


package static01;

class Apple {
	int count;
	
}

public class Static01 {
	public static void main(String[] args) {

		Apple a1 = new Apple();
		a1.count = 1;
		
		Apple a2 = new Apple();
		a2.count = 10;
		
		System.out.println(a1.count);	// 1
		System.out.println(a2.count);	// 10
		
	}

}

class Apple에 대한 인스턴스 a1 & a2 생성.

a1 & a2 는 각각의 고유한 객체 공간에 count라는 변수를 가지고 있음!!

 

*** 만약 필드에 static int count; 으로 선언된다면, 

package jun20;

class Apple{
	static int count;
	
}


public class static01 {
	public static void main(String[] args) {
		
		Apple a1 = new Apple();
		a1.count = 1;		// 표기로는 a1의 count지만 사실 메소드 영역의 count!!
		
		Apple a2 = new Apple();
		a2.count = 10;		// 표기로는 a1의 count지만 사실 메소드 영역의 count!!
        
		// Apple.count = 10; => 정확한 표현
		
		System.out.println(a1.count);	// 10
		System.out.println(a2.count);	// 10

	}

}

** static이 붙으면 객체 생성시에 힙 영역이 아닌 메소드 영역에 저장됨! => 따라서 static객체 생성 전에 쓰임


package jun20;

class Apple{
	static int COUNT = 100;	// 상수 _ 대문자로 표기 (수정가능)
	
}


public class static01 {
	public static void main(String[] args) {
		
		Apple.COUNT = 10;
		System.out.println(Apple.COUNT);	// 100
		
		Apple a1 = new Apple();
		a1.COUNT = 1;
		
		Apple a2 = new Apple();
		a2.COUNT = 100;
				
		System.out.println(a1.COUNT);	// 100
		System.out.println(a2.COUNT);	// 100
		
        // 인스턴스명이 달라도(a1 & a2)  사실 모두 Apple.count 로 같은 값인거! 
	}

}

 

**    static final int COUNT = 100;   =>   수정불가 상수

 

** 책 p. 279 _ 싱글톤****


[ 자바 메모리 구조 ]

https://velog.io/@shin_stealer/%EC%9E%90%EB%B0%94%EC%9D%98-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EA%B5%AC%EC%A1%B0

 

자바의 메모리 구조

Java의 메모리 구조에 대해서 공부했던 내용을 정리한 글입니다.개인적으로 공부한 자료라 틀린 부분이 있을 수 있습니다.여기, 같은 기능을 하는 두 개의 프로그램이 있다고 가정해보자1) 메모

velog.io


[ 디자인패턴 ]

https://m.hanbit.co.kr/channel/category/category_view.html?cms_code=CMS8616098823 

 

[Design pattern] 많이 쓰는 14가지 핵심 GoF 디자인 패턴의 종류

디자인 패턴을 활용하면 단지 코드만 ‘재사용’하는 것이 아니라, 더 큰 그림을 그리기 위한 디자인도 재사용할 수 있습니다. 우리가 일상적으로 접하는 문제 중 상당수는 다른 많은 이들이 접

m.hanbit.co.kr

 


패키지 (286p) : 관련성 있는 자바 파일들을 폴더 단위로 구분 (패키지명.패키지명)

com.poseidon.print (3단계는 spring때...)

net.daum.map

import (290p) : 상위패키지.하위패키지.클래스명;

import java.util.ArrayList;

import java.util.HashSet;

import java.util.HashMap;

import java.util.*; => * 은 모든 파일을 의미, java.util.*; : java의 util에서 사용하는 것들만 가져와.

 

2023-06-20 : 프로그래밍 언어활용

static, 상속, 추상화, 인터페이스 순으로..