본문 바로가기
Backend

06월 12일 수 | OOP 18 - JAVA의 라이브러리와 싱글톤패턴

by 구라미 2019. 6. 12.

14. Java의 라이브러리

라이브러리란?

Library 도서관처럼

자바의 기능들을 모아둔 것이다.

- 컴퓨터에서 자주 사용되는 부분(함수)을 프로그램상에 모아 놓은 것이다.

- 언제든지 자유롭게 이용할 수 있도록 구성해 놓은 jar 파일이다.

 

 

자바 소스프로그램 .java

--------- 컴파일 ---------

자바 목적프로그램 .class

.class 파일들을 압축 -> .jar

 

 

JAR란?

JAR는 여러개의 자바 클래스 파일과, 클래스들이 이용하는 관련 리소스 및 메타데이터를 하나의 파일로 모아서 자바 플랫폼에 응용 소프트웨어나 라이브러리를 배포하기 위한 소프트웨어 패키지 파일 포맷이다.

JAR 파일은 자바 런타임이 효율적으로 애플리케이션을 배치(디플로이)할 수 있는 수단으로 설계되었다. 자바 애플리케이션을 구성하는 클래스와 관련 리소드들을 단일 파일로 묶어 압축된 형태인 JAR 파일은, 한 차례의 요청으로 애플리케이션 전체를 다운로드할 수 있게 해준다.

JAR 파일은 META-INF/MANIFEST.MF경로에 위치한 매니페스트 파일을 선택적으로 포함할 수 있다. 매니페스트 파일 안에는, 어떻게 JAR 파일을 이용할지를 기술한 엔트리 정보가 적혀있다. 이를테면 클래스패스(자바) 엔트리를 사용하면 해당 JAR 파일과 함께 로드할 다른 JAR 파일들을 지정할 수 있다. java.util.zip 패키지는 JAR 파일을 읽고 쓰는 클래스들을 포함하고 있다.

 

라이브러리 추가하기

 

 

프로젝트 우클릭 -> export -> java -> Runnable jar file -> 그 다음 프로젝트 고르고 생성

 

그 다음 CMD로 확인해보면 jar파일이 생성된 것을 확인할 수 있다.

 

java -jar basicJava.jar 로 내용을 확인해볼 수 있다.

 

 

싱글톤이란?

특정 클래스의 인스턴스가 하나만 만들어지고, 어디서든지 그 인스턴스에 접근할 수 있도록 하기 위한 패턴

싱글톤 패턴은 특정 클래스에 대해 객체 인스턴스가 하나만 만들어질 수 있도록 해 주는 패턴이다.

즉, 싱글톤 패턴의 핵심은 어떠한 상황에서든 해당 객체의 인스턴스는 하나만 존재해야 한다는 것. 

 

Static이란 키워드도 함께.

 

package kr.co.singleton1;

class Mountain {
	String name; //산이름
	int height; //산높이
	public Mountain(){}
	
}//class end


public class Test01_Mountain {

	public static void main(String[] args) {
		// 일반 클래스
		
		//자료형 레퍼런스변수 = 객체
		//객체가 생성 -> 주소값 발생
		Mountain one = new Mountain(); //객체
		Mountain two = new Mountain(); //객체
		
		//주소값이 서로다름
		System.out.println(one.hashCode()); 
		System.out.println(two.hashCode());
		
		//서로 다른 객체이다
		System.out.println(one.toString());
		System.out.println(two.toString());

		Mountain three = two;
		System.out.println(three.hashCode()); //two와 해시코드가 같다.
		System.out.println(three.toString()); //two와 같다.
		
		
	}//main end
}//class end

 

싱글톤 클래스 설계하기

특정 클래스

 

싱글톤 클래스 설계 1)

package kr.co.singleton1;

//싱글톤 클래스 설계하기
public class Singleton {
	//1) 외부에서 생성자 함수를 호출할 수 없다.
	//-> 하지만 객체를 단 하나는 생성할 수 있게 해야한다.
	private Singleton() {}
	
	//2) private이 걸려 있어도 내부 클래스에서는 생성자 함수 호출이 가능하다.
	//-> 클래스에 고정되어 정적 필드로 자기 자신의 객체를 생성하고
	//-> 여기에도 private를 붙여서 외부클래스의 접근을 막는다.
	private static Singleton single = new Singleton();
	
	//3) 이 객체를 외부에서 접근할 수 있게 메소드를 
	//-> 만들어줘야한다.
	//-> 외부에서 이 객체를 얻는 유일한 방법이다.
	static Singleton getSingle(){
		return single;
	}
	
	
}//class end

 

getter, setter 메소드

 

main 메소드가 있는 클래스에서 확인해보면

package kr.co.singleton1;

public class Sington_mainTest {

	public static void main(String[] args) {
		// 싱글톤 클래스 연습
		
		//Singleton obj = new Singleton(); -에러 
		//생성자함수를 private으로 접근제한 해두었음.
		//new 연산자로 객체를 생성할 수 없다.
		
		//static 접근방법 -> 클래스명.static변수
		Singleton obj1 = Singleton.getSingle();
		System.out.println(obj1);
		
		Singleton obj2 = Singleton.getSingle();
		System.out.println(obj2);
		
		if(obj1==obj2){
			System.out.println("같은 객체입니다.");
		}else {
			System.out.println("다른 객체입니다.");
		}
		
	}//main end
}//class end

결과값을 확인해보면 같은 객체입니다. 라는 결과가 나온다.

 

 

싱글톤 클래스 설계 2)

생성자 함수 만들기 - shift + alt + s + c

오버라이드 - shift + alt + s + v

getter,setter - shift + alt + s + r 

 

LeeSoonShin 클래스

package kr.co.singleton2;

//싱글톤 클래스 설계
public class LeeSoonShin {
	private String name;
	private int age;
	private String address;
	
	
	//1) 객체를 외부에서 만들 수 없도록
	//   생성자함수를 private속성으로 한다.
	private LeeSoonShin(){}
	public LeeSoonShin(String name, int age, String address) {
		this.name = name;
		this.age = age;
		this.address = address;
	}
	
	//1-1 getter,setter 생성(외부 연결 통로)
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String getAddress() {
		return address;
	}
	public void setAddress(String address) {
		this.address = address;
	}
	
	public void info(){
		System.out.println(name);
		System.out.println(age);
		System.out.println(address);
	}
	
	//2) 내부에서 객체 하나를 만들어서 상수화 
	//   static final
	private static final LeeSoonShin lss = new LeeSoonShin("이순신",59,"광화문");
	
	
	//3) 2)에서 선언된 레퍼런스변수(lss)에 대한 
	//getter, setter함수 만들기	
	public static LeeSoonShin getlss(){
		return lss;
	}
	
}//class end

 

 

테스트 

package kr.co.singleton2;

public class Test {
	
	public void disp(){
		LeeSoonShin lee = LeeSoonShin.getlss();
		System.out.println(lee);
		
	}//main end
}//class end

 

메인 클래스

package kr.co.singleton2;

public class MainTest {

	public static void main(String[] args) {
		// 싱글톤 클래스 연습
		
		//싱글톤 클래스는 new연산자로 객체생성할 수 없다.
		//LeeSoonShin lss = new LeeSoonShin(); - 에러
		
		LeeSoonShin lss = LeeSoonShin.getlss();
		lss.info(); //이게 먼데용
		System.out.println(lss);
		
		Test test = new Test();
		test.disp(); //같은 메모리 주소가 나온다. 공유와 continue

	}//main end
}//class end

 

 

 

댓글