문법/기본 문법

객체지향 심화(0119)

코딩 화이팅 2023. 1. 19. 17:50

패키지

  • PC의 많은 파일을 관리하기 위해서 폴더를 이용한다.
  • 프로그램의 많은 클래스를 관리하기 위해서 패키지를 이용한다.
  • 클래스와 관련 있는 인터페이스들을 모아두기 위한 이름 공간
  • 패키지의 이름은 시중에 나와 있는 패키지들과 구분되게 지어야 한다.
  • 패키지의 구분은 .(dot) 연산자를 이용한다.
    com.ssafy.project_이름.module_이름
  • 패키지 사용 이유 : 정리하기 위해서 / 패키지 단위로 접근 제어 가능 / 클래스를 구별할 수 있다.

임포트

  • 다른 패키지에 있는 클래스를 사용하기 위해서는 import 과정이 필요하다.
  • import 선언할 때는 import 키워드 뒤에 package 이름과 클래스 이름을 모두 입력하거나, 해당 패키지의 모든 클래스를 포함할 때는 '*'를 사용하기도 한다.
    import package_name.class_name;
package pkg1;//패키지 선언문: 이 클래스가 어떤 패키지에 속하는지?
//항상 클래스는 하나의 패키지 안에 포함이 되어야 함

public class person {
	public String pkg="pkg1";
}
==========================================================================
package pkg1.pkg2;

public class person {
	public String pkg="pkg1.pkg2";
}
==========================================================================
package pkg1.pkg2.pkg3;

public class person {
	public String pkg="pkg1.pkg2.pkg3";
}
==========================================================================
package pkg1;
import pkg1.pkg2.pkg3.person;
//패키지 명을 생략하고 쓰겠다.
public class pkgTest {
	public static void main(String[] args) {
		//서로 다른 패키지에 있는 클래스 중에서
		//하나를 골라서 쓸 때만 이렇게 쓸 수 있다.
//		person p1=new person();
//		System.out.println(p1.pkg);
		
		//만약에 서로 다른 패키지에 있는 이름이 같은 클래스를 
		//두 개 이상 사용하고 싶다면->패키지를 생략할 수 없고
		//패키지명.클래스명->풀패키지이름
		
		pkg1.person p1=new pkg1.person();
		pkg1.pkg2.person p2=new pkg1.pkg2.person();
		pkg1.pkg2.pkg3.person p3=new pkg1.pkg2.pkg3.person();
		person p4=new person();
		
		System.out.println(p1.pkg);
		System.out.println(p2.pkg);
		System.out.println(p3.pkg);
		System.out.println(p4.pkg);
	}
}
==========================================================================
package test01;

//import java.util.Arrays;
//import java.util.Date;
//import java.util.Scanner;

import java.util.*;
import java.util.logging.*;
//하위패키지에 있는 클래스까지 임포트되는 것은 아니다.
//하위패키지라고 해도 엄연히 다른 패키지이다.
public class test01_1 {
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		Date d=new Date();
		int [] arr= {1,2,3,4,5};
		Arrays.toString(arr);
		
//		java.util.logging.Logger
		Logger l=Logger.getGlobal();
	}
}

접근 제한자

  • 클래스, 멤버 변수, 멤버 메서드 등의 선언부에서 접근 허용 범위를 지정하는 역할의 키워드이다.
  • 접근 제한자의 종류
    public: 모두 공개
    protected
    (default) : 접근 제한자를 생략하면 default
    private: 나만
  • 그 외 제한자
    static : 클래스 레벨의 요소 설정
    final
    abstract

public

모든 위치에서 접근이 가능

package test07_public;
//class는 public 아니면 default
public class person {
	public String name;
	public int age;
	//어디서든 접근 가능
	
	public static void main(String[] args) {
		person p1=new person();
		//자기 자신이므로 접근 가능
		p1.name="강현";
		}
}
package test07_public;

public class personTest {
	public static void main(String[] args) {
		person p1=new person();
		//다른 클래스에 있지만 같은 패키지 이므로 public 속성에 접근 가능
		p1.
		
	}
}
package test07_public2;
import test07_public.person;
public class personTest {
	public static void main(String[] args) {
		person p1=new person();
		//다른 패키지에 있지만 public 속성에 접근 가능
		p1.
		
	}
}

protected

같은 패키지에서 접근이 가능, 다른 패키지 접근 불가능. 단, 다른 패키지의 클래스와 상속관계가 있을 경우 접근 가능

package test05;
//class는 public 아니면 default
public class person {
	protected String name;
	protected int age;
	//다른 패키지에서는 안되지만 다른 패키지에 있더라도 상속을 받은 클라스라면 접근 가능
	
	public static void main(String[] args) {
		person p1=new person();
		//자기 자신이므로 접근 가능
		p1.name="강현";
		}
}
package test05;

public class personTest {
	public static void main(String[] args) {
		person p1=new person();
		//다른 클래스에 있지만 같은 패키지 이므로 protected 속성에 접근 가능
		p1.
		
	}
}
package test06;
import test05.person;
public class personTest {
	public static void main(String[] args) {
		person p1=new person();
		//다른 패키지에 있으므로 protected 속성에 접근 불가
		p1.
		
	}
}
package test06;
import test05.person;
public class student extends person {
	public static void main(String[] args) {//extends 상속 메소스
		student s1=new student();//상속을 받았으므로 다른 패키지에 있더라도 protected속성에 접근 가능
		s1.
	}
}

default

같은 패키지에서만 접근이 허용 / 접근 제한자가 선언이 안 되었을 경우 기본 적용

package test03;
//class는 public 아니면 default
public class person {
	String name;//접근 제한자를 생략하면 (default)
	int age;//멤버 변수
	
	
	public static void main(String[] args) {
		person p1=new person();
		//자기 자신이므로 접근 가능
		p1.
		}
}
package test03;

public class personTest {
	public static void main(String[] args) {
		person p1=new person();
		//다른 클래스에 있지만 같은 패키지 이므로 default 속성에 접근 가능
		p1.
		
	}
}
package test04;
import test03.person;
public class personTest {
	public static void main(String[] args) {
		person p1=new person();
		//다른 패키지에 있으면 default 속성에 접근 불가
		p1.
		
	}
}

private

자신 클래스에서만 접근이 허용

클래스 사용 가능 : public, default

package test02;
//class는 public 아니면 default
public class person {
	private String name;//멤버변수
	private int age;//멤버 변수
	
	//private 접근 제한자는 같은 클래스 내에서만 접근이 가능
	public static void main(String[] args) {
		person p1=new person();
		//자기 자신이므로 접근 가능
		p1.name="강현";
		}
}
package test02;

public class personTest {
	public static void main(String[] args) {
		person p1=new person();
		p1.
		// private 접근 제한자는 다른 클래스에 있으므로 접근 불가 
	}
}
수식어 클래스 내부 동일 패키지 (다른 패키지내의)
하위 클래스
다른 패키지
private o      
(default) o o    
protected o o (상속한다면 가능)  
public o o o o

접근자/설정자

  • 클래스에서 선언된 변수 중 접근제한에 의해 접근할 수 없는 변수의 경우 다른 클래스에서 접근할 수 없기 때문에, 접근하기 위한 메서드(설정자와 접근자)를 public으로 선언하여 사용

싱글턴 패턴

객체를 단 하나만 만들 때

JVM 메모리 구조

  • Java 언어는 메모리 관리를 개발자가 하지 않음.
  • GC(Garbage Collection)가 메모리 관리
    Garbage Collection : Heap 영역(class 영역 포함)에 생성된 메모리 관리 담당 / 
    더 이상 사용되지 않는 객체들을 점검하여 제거
    자동적 실행 / CPU가 한가 or 메모리 부족
    JVM에 의해서 실행
    System.gc()를 통해 호출(시스템 영향을 줘서 하지 않기)
package test08_getSetter;

public class person {
	//접근자와 설정자 만들기
	//먼저 멤버 변수를 private으로 선언
	private String name;
	private int age;
	private boolean hungry;
	
	//위 멤버변수에 접근할 수 있는 통로를 
	//public한 메서드로 만들어줌
	//값을 변경->설정자(setter) : set+멤버변수 이름
	//값을 조회->접근자(getter) : get+멤버변수 이름
	//마우스 우클릭 ->Source->generate getters and setters
	
	public String getName() {
		
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		if (age<0) {
			System.out.println("나이가 음수는 될 수 없다.");
			return;
		}
		if (age>200) {
			System.out.println("오래 살수는 없다.");
			return;
		}
		this.age = age;
	}
	public boolean isHungry() {
		return hungry;
	}
	public void setHungry(boolean hungry) {
		this.hungry = hungry;
	}
}
package test08_getSetter;

public class personTest {
	public static void main(String[] args) {
		person p1=new person();
		
		//p1.age=30;하는 거랑 차이 : set이라는 함수안에 로직을 통해 필터링 과정을 거쳐 출력되어질 수 있다.
		p1.setName("강현");//public 메서드라서 접근 가능
//		p1.setAge(26);
		p1.setAge(300);//setter를 이용해서 멤버변수의 값을 수정 가능
		
		System.out.println(p1.getAge());
		System.out.println(p1.getName());
	}
}
package test09_singleturn;

public class person {
	//싱글턴으로 바꾸기
	//1. private으로 자기 자신 만들기
//	객체를 생성하지 않고, 클래스 이름으로 생성하기 위해서
	private static person instance=new person();
	
//	2. 생성자를 막기
	private person() {
		this.name="유일한 사람";
		this.age=123;
	}
	
	//유일한 객체에 접근할 수 있는 통로 만들기
	public static person getInstance() {
		return instance;
	}
	
	
	
	//접근자와 설정자 만들기
	//먼저 멤버 변수를 private으로 선언
	private String name;
	private int age;
	private boolean hungry;
	
	//위 멤버변수에 접근할 수 있는 통로를 
	//public한 메서드로 만들어줌
	//값을 변경->설정자(setter) : set+멤버변수 이름
	//값을 조회->접근자(getter) : get+멤버변수 이름
	//마우스 우클릭 ->Source->generate getters and setters
	
	public String getName() {
		
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		if (age<0) {
			System.out.println("나이가 음수는 될 수 없다.");
			return;
		}
		if (age>200) {
			System.out.println("오래 살수는 없다.");
			return;
		}
		this.age = age;
	}
	public boolean isHungry() {
		return hungry;
	}
	public void setHungry(boolean hungry) {
		this.hungry = hungry;
	}
}
package test09_singleturn;

public class personTest {
	public static void main(String[] args) {
//		person p1=new person();//싱글턴에서는 추가로 객체 추가 X
		person p1=person.getInstance();
		System.out.println(p1.getName());
		System.out.println(p1.getAge());
		
		person p2=person.getInstance();
		System.out.println(p1.getName());
		System.out.println(p1.getAge());
	}
}

영화관리

public class class1 {
	private int id;
	private String title;
	private String director;
	private String genre;
	private int runningTime;
	
	
	//마우스 우클릭->source->generate constructor using field
	public class1() {
	
	}
	public class1(int id, String title, String director, String genre, int runningTime) {
		this.id = id;
		this.title = title;
		this.director = director;
		this.genre = genre;
		this.runningTime = runningTime;
	}
	//접근자와 설정자
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getTitle() {
		return title;
	}
	public void setTitle(String title) {
		this.title = title;
	}
	public String getDirector() {
		return director;
	}
	public void setDirector(String director) {
		this.director = director;
	}
	public String getGenre() {
		return genre;
	}
	public void setGenre(String genre) {
		this.genre = genre;
	}
	public int getRunningTime() {
		return runningTime;
	}
	public void setRunningTime(int runningTime) {
		this.runningTime = runningTime;
	}
	@Override
	public String toString() {
		return "class1 [id=" + id + ", title=" + title + ", director=" + director + ", genre=" + genre
				+ ", runningTime=" + runningTime + "]";
	}
	
	
}
public class movieManager {
	
	private final int MAX_SIZE=100; 
	
	private class1[] movielist=new class1[100];
	
	//싱글턴 
	//1. private으로 자기 자신의 인스턴스 만들기
	//2. 생성자를 private으로 막기
	//3. 유일한 인스턴스에 접근 가능한 getter 만들기
	
	private static movieManager instance = new movieManager();
	private movieManager () {
		
	}
	public movieManager getInstance() {
		return instance;
	}
	
}