[ 클래스의 접근제어 ] _ 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 _ 싱글톤****
[ 자바 메모리 구조 ]
자바의 메모리 구조
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, 상속, 추상화, 인터페이스 순으로..
'국비과정 > JAVA' 카테고리의 다른 글
20230620 _[13일차]_03. 추상화 (0) | 2023.06.21 |
---|---|
20230619 _[12일차]_02. Set & Map (0) | 2023.06.21 |
20230619 _[12일차]_01. ArrayList (0) | 2023.06.20 |
20230616 _[11일차]_03. 여러생성자 만들기 연습 & static 변수 (0) | 2023.06.20 |
20230616 _[11일차]_02. 기본생성자 & 명시된생성자 & this (0) | 2023.06.19 |