개발을 하다 보면 외부 API를 연동할 일이 생긴다. 

까먹지 않기 위해 끄적끄적!

 

예제코드

import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;

public class TestApi {
    public JSONObject ApiTest(){
        String data = "API 형식에 맞는 INPUT DATA";
        String url = "호출URL";

        JSONObject resultObject = new JSONObject(); // OUTPUT DATA 변수
        try{
            URL apiurl = new URL(url);
            HttpURLConnection conn = (HttpURLConnection)apiurl.openConnection();
            conn.setRequestMethod("POST");
            conn.setRequestProperty("APIKey", "");  // API 보안키
            conn.setRequestProperty("Content-type","application/json");
            conn.setRequestProperty("Accept","application/json");
            conn.setDoInput(true);
            conn.setDoOutput(true);

            OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream(), "UTF-8");
            wr.write(data);
            wr.flush();
            wr.close();

            StringBuilder sb = new StringBuilder();
            if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) {	// 200
                BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));
                String line;
                while ((line = br.readLine()) != null) {
                    sb.append(line).append("");
                }
                br.close();
            }else {
                sb.append("{\"CODE\" : \""+conn.getResponseCode()+"\"");
                sb.append(", \"REASON\" : \""+conn.getResponseMessage()+"\"}");
            }

            JSONParser jsonParser  = new JSONParser();
            resultObject = (JSONObject)jsonParser.parse(sb.toString());
        } catch (Exception e){
            e.printStackTrace();
        }
        return resultObject;
    }
}

설명

data, url, 메소드 return값은 각자 형식에 맞게 설정!

 

setRequestMethod : GET, POST 요청방식 설정

setRequestProperty : Request header 값 설정

setDoInput :  InputStream으로 서버로부터 응답을 받겠다는 옵션.

setDoOutput : OutputStream으로  데이터를 넘겨주겠다는 옵션.

getResponseCode가 정상일땐 output을 받고, 아닐경우! 응답상태와 응답메세지 받기! 😁

프로그램이란?

컴퓨터가 사람의 일을 할 수 있도록 해주는 것

컴퓨터에 처리되는 작업의 순서를 논리적으로 명령어로 작성하는 것

사용자의 명령에 반응하는 소프트웨어(프로그래밍의 결과문)

 

Java언어의 좋은 점

플랫폼 독립적이라서 여러 운영체제나 하드웨어에서도 동일하게 실행된다.

많은 오픈소스 프레임워크로 생산성을 증가하고 유지보수 비용을 절감할 수 있다.

간결하면서도 강력한 객제지향언어이다.

이식성 우수, 라이브러리 지향성, 보안성, 멀티스레드, 가상머신(JVM), 바이트코드

 

객체지향언어(Object Oriented Programming)의 장단점

*장점

 

캡슐화

필요한 속성과 행위를 하나로 묶고 그중 일부를 외부에서 사용하지 못하도록 은닉한다.

관련된 코드와 데이터가 묶여있고 오류가 없어 사용이 편리합니다. 데이터를 감추고(private) 외부 세계와의 상호작용은 메서드(getter, setter)를 통하는 방법인데, 라이브러리로 만들어 업그레이드하면 쉽게 바꿀 수 있습니다.

 

상속(extends)

이미 작성된 클래스를 이어받아서 새로운 클래스를 생성하는 기법으로 기존 코드를 재활용해서 사용하는 것을 의미한다.

 

다형성(polymorphism)

하나의 이름으로 많은 상황에 대처하는 기법.(하나의 객체가 여러가지 타입을 가질수 있는 것)

개념적으로 동일한 작업을 하는 함수들에 똑같은 이름을 부여할 수 있다.

조상클래스의 인스턴스를 이용하여 자손타입의 클래스를 다룬다거나, 메서드 오버로딩을 통하여 동일이름의 메서드를 이용하여 다양한 형태의 파라미터를 다루는 것.

  • 참조글 : https://chlee21.tistory.com/70?category=935054

 

*단점

개발 설계의 복잡함, 느려지는 런타임 속도

 

자바의 데이터 타입인 Primitive Type과 Reference Type이란?

데이터타입 설명
Primitive Type 기본형 타입으로 변수에 값 자체를 저장한다.
기본값이 있기때문에 Null이 존재하지 않는다. Null을 넣고 싶다면 래퍼클래스를 활용한다.
실제 값을 저장하는 공간으로 스택(Stack) 메모리에 저장된다.
컴파일시 담을수 있는 크기를 벗어나면 컴파일에러가 발생한다.
byte(1), short(2), char(2), int(4), long(8), float(4), double(8), boolean(2) 총 8가지이다.
Reference Type 참조형 타입으로 메모리상에 객체가 있는 위치를 저장한다.
빈 객체를 의미하는 Null이 존재한다.
값이 저장되어 있는 곳의 주소값을 저장하는 공간 힙(Heap) 메모리에 저장된다.
클래스타입, 열거타입, 인터페이스타입, 배열타입이 있다. 할당메모리크기 (4)

 

배열과 컬렉션의 차이점

배열은 하나의 자료형만 저장할 수 있고 크기가 고정적이다.

컬렉션은 복수의 자료형을 저장할 수 있고 크기가 가변적이다.

 

멀티스레드의 장단점

두 가지 이상의 작업을 동시해 실행 할 수 있어 자원을 효율적으로 이용할 수 있으나 dead lock 및 동기화에 대한 철저한 검증이 필요하다.

 

멀티스레드 구현방법

Thread 클래스를 상속(단일상속만 가능)받는법과 Runnable 인터페이스를 상속(다중상속 가능)받는법

  • 참조글 : https://chlee21.tistory.com/7?category=935054

 

Java 컬렉션의 대표 인터페이스는 ?

List : 순서가 있는 데이터의 집합으로 중복을 허용한다.

구현클래스 - ArrayList, LinkedList, Stack, Vector

 

Set : 순서를 유지하지 않는 데이터의 집합으로 중복을 허용하지 않는다.

구현클래스 - HashSet, TreeSet

 

Map : 키와 값이 쌍으로 이루어진 데이터의 집합으로 순서는 유지되지 않으면 키는 중복을 허용하지 않고 값은 중복을 허용한다.

구현클래스 - TreeMap, HashMap, HashTeble, Properties

 

컬렉션 List 인터페이스를 구현한 ArrayList 컬렉션 클래스란 ?

가변적 크기이다.

순차적으로 요소 값을 저장한다.

중복 요소 값을 허용한다.

 

 

컬렉션에 제네릭이 추가된 이유

컬렉션엔 다향한 데이터 타입이 들어갈 수 있는데 이를 명확하게 표시하기 위해 제네릭이 추가되었다.

컬렉션은 복수개의 데이터 타입 요소값이 저장되다 보니 원하는 자료형 타입 요소값을 추출하기 어렵다.

그러므로 지정한 자료형 타입 한가지만 저장하기 위해서 나온 것이 제네릭이다.

 

접근제어자의 종류와 특성

public : 접근 제한이 없다.

protected : 같은 패키지 내에서, 그리고 다른패키지의 자손클래스에서 접근가능

default : 같은 패키지 내에서만 접근가능

private : 같은 클래스 내에서만 접근가능

 

접근허용범위 : public > protected > default > private

 

Wrapper 클래스란 무엇인가?

primitive 타입으로 표현할 수 있는 간단한 데이터를 객체로 만들어야할 경우가 있는데 그러한 기능을 지원하는 클래스

byte Byte
short Short
int Integer
long Long
char Charater
float Float
double Double
boolean Boolean

 

추상클래스란 ?

클래스를 설계도에 비유하자면 추산클래스는 미완성 설계도에 비유할 수 있다.

미완성 설계도란, 단어의 뜻 그대로 완성되지 못한 채로 남겨진 설계도를 말한다.

클래스가 미완성이라는 것은 멤버의 개수에 관계된 것이 아니라, 단지 미완성 메서드(추상메서드)를 포함하고 있다는 의미이다. 미완성 설계도로 완성된 제품을 만들 수 없듯이 추상클래스로 인스턴스는 생성 할 수 없다. 추상클래스는 상속을 통해서 자손클래스에 의해서만 완성될 수 있다.

 

1. 추상클래스는 뭐? 실체클래스의 공통적인 부분(변수,메서드)를 추출해서 선언한 클래스

2. 추상클래스는 객체를 생성할 수 없다! 아직은 실체성이 없고 구체적이지 않기 때문에!

3. 추상클래스와 실체클래스는 어떤관계? 상속관계!

 

추상클래스 사용이유

1. 공통된 필드와 메서드를 통일할 목적

2. 실체클래스 구현시, 시간절약

3. 규격에 맞는 실체클래스 구현

 

인터페이스란 ?

자바의 다형성을 극대화하여 개발코드 수정을 줄이고 프로그램 유지보수성을 높이기 위해 사용한다.

인터페이스는 일종의 추상클래스이다. 인터페이스는 추상클래스처럼 추상메서드를 갖지만 추상클래스보다 추상화정도가 높아서 추상클래스와는 달리 몸통을 갖춘 일반 메서드 또는 멤버변수를 구성원으로 가질 수 없다. 

오직 추상메서드와 상수만을 멤버로 가질 수 있으며, 그 외 어떠한 요소도 허용하지 않는다. 추상클래스를 부분적으로 완성된 '미완성 설계도'라고 한다면, 인터페이스는 구현된 것은 아무것도 없고 밑그림만 그려져 있는 '기본 설계도'라고 말 할 수 있다. 인터페이스는 인터페이스로부터만 상속받을 수 있으며, 클래스와 달리 다중상속, 즉 여러개의 인터페이스로부터 상속을 받는 것이 가능하다.

 

자바의 GUI에서 스윙과 AWT의 차이점

AWT(Abstract Window Toolkit)는 운영체제가 갖고 있는 각 컴포넌트를 이용한다. 즉 운영체제에 종속적인 GUI로서 운영체제 종류에 따라 화면에 출력되는 모양이 약간씩 다르다.

스윙은 운영체제가 갖고 있는 GUI를 사용하지 않고 자바 가상머신의 Swing패키지를 직접 사용해 구현한다.

따라서 운영체제가 달라도 동일한 화면을 출력하게된다. 스윙이 AWT보다 세련되고 다양한 GUI를 제공해주기 때문에 자바 어플GUI개발에서는 AWT보다 스윙을 더 많이 사용한다.

 

가비지 콜렉터란 ?

Garbage Collection은 동적 할당된 메모리 영역(Heap) 가운데 더이상 사용할 수 없게 된 영역을 탐지하여 자동으로 해제하는 기법이다. 쓰레기 수집이 지원되는 환경에서는 프로그래머가 동적으로 할당한 메모리 영역의 전체를 완벽하게 관리할 필요가 없어진다. 이러한 작업은 CLR의 '가비지컬렉터'라는 일종의 백그라운드 서비스를 통해 자동으로 이뤄진다.

 

오버로딩과 오버라이딩의 차이점

오버로딩 : 메소드의 이름은 같지만 데이터 형식이나 매개변수의 개수를 다르게 정의하는 것

오버라이딩 : 기존의 메소드를 재정의 하는 것으로 데이터 형식이나 매개변수의 개수가 같아야 한다.

 

Exception 이란?

프로그램의 비정상적인 종료나 중단을 막을 수 있다.

RuntimeException(실행시 발생하는 예외)이나 그 외 Exception(컴파일시 발생하는 예외)으로 나눌 수 있다.

직접 처리하는 방식은 try ~ catch

다음 처리할 곳으로 넘기는 방식은 throws

 

동기화란 ?

하나의 자원을 여러 태스크가 사용하려 할 때, 한 시점에서 하나의 태스크만 사용할 수 있도록 하는 것.

 

프로세스와 쓰레드의 차이점

프로세스 : 실행 중인 프로그램, 자원과 쓰레드로 구성

쓰레드 : 프로세스 내 실제 작업을 수행하는 단위, 모든 프로세스는 하나 이상의 쓰레드를 가지고 있다.

멀티쓰레드 : 하나의 프로세스에 하나 이상의 쓰레드를 생성하여 실행

 

웹 크롤링이란 ?

web, xml, json을 통해서 데이터를 수질할 수 있는 기능 (Web page의 tag를 통해서 데이터를 취합)

 

데이터 수집 : Java(jsoup), python(Beautiful Soup) - 제일 어렵다.

데이터 정형화 : 필요없는 문자 추려내기, 문자 검토하여 단어 형태로 만들어 놓는 것, (일반 -> 배열, 리스트)

분석 : 머신러닝

결과의 시각화 : app, web

 

우선 jsoup.jar파일이 필요하다.

https://mvnrepository.com/

해당 사이트에서 파일 다운로드가 가능하다.

 

다이나믹 웹 프로젝트의 lib폴더에 다운받은 jar파일을 추가한다.

Jsoup : 각종 사이트(HTML)에서 데이터를 취합할 수 있는 Library

 

 

데이터를 크롤링 할 사이트를 선택한다.

필자는 CGV 무비 차트 사이트에서 크롤링을 해보려 한다.

 

해당 사이트에 들어가 페이지 소스보기를 클릭한다.

해당 사이트의 html문서가 열리게 된다. 

이곳에서 가져올 정보의 태그명과 클래스명 또는 아이디명을 가져온다.

 

 

예제 Class

import java.io.IOException;


import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

public class MainClass {
	public static void main(String[] args) throws IOException {

		// 자료를 가져올 사이트에 연결하기
		Document doc = Jsoup.connect("http://www.cgv.co.kr/movies/").get();
	//	System.out.println(doc.data()); // html 코드를 가져온다.
    
    
		/* 크롤링 예시
		 <div class="box-contents">
                        <a href="/movies/detail-view/?midx=82986">
                            <strong class="title">블랙 위도우</strong>
                        </a>
                        
         <div class="score">
                            <strong class="percent">예매율<span>23.2%</span></strong>
                            <!-- 2020.05.07 개봉전 프리에그 노출, 개봉후 골든에그지수 노출변경 (적용 범위1~ 3위)-->
                            <div class='egg-gage small'>               
		 */
		
		Elements titles = doc.select("div.box-contents strong.title");
		// 묶기전 큰 묶음부터 묶어주는게 좋다.
		Elements percents = doc.select("div.box-contents div.score strong.percent span");
		for (int i = 0; i < 7; i++) {
			Element title = titles.get(i);
			Element percent = percents.get(i);
			System.out.println(title.text() + " : "+ percent.text()); // 보고있는 사이트의 영화 제목을 다 가져온다.
		}
	}
}

 

Document

해당 사이트의 html 문서 전체

connect(url).get()

자료를 가져올 사이트에 연결하기

Elements

select로 접근한 요소에 관련된 Element 데이터를 담는 자료형

Element

select로 접근한 요소

 

 

실행결과

블랙 위도우 : 21.7%
랑종 : 14.6%
이스케이프 룸 2-노 웨이 아웃 : 5.8%
크루엘라 : 1.8%
꽃다발 같은 사랑을 했다 : 0.8%
오필리아 : 0.7%
(월간오페라)카발레리아 루스티카나 : 0.3%

 

 

Collection

정의
참조형 데이터를 저장하는 '저장소' 객체
자료구조 : 가변배열

 

종류
List : 순서보존 O, 중복허용 O ,
자료형 : ArrayList, LinkedList
Set : 순서보존 X, 중복허용X, 정렬을 해줌, 크기제한 X, (쓸일 거의 없다) 옵션..
자료형 : TreeSet

 

ArrayList

List 인터페이스를 상속받아 데이터의 저장 순서가 유지되고 중복을 허용
크기가 가변적이고, 선형구조를 가지고 있다.
ArrayList 사용 시 import문을 작성해 주어야 한다.

선형구조 : O-O-O-O-O-O
삭제 후 정리, 검색 속도가 빠르다.

 

LinkedList

배열은 가장 기본적인 형태의 자료구조로 구조가 간단하다
LinkedList사용 시 import문을 작성해 주어야 한다.

장점
사용하기 쉽고 데이터를 읽어오는데 걸리는 시간이 가장 빠르다.

단점
크기를 변경할 수 없다.
비순차적인 데이터의 추가 또는 삭제에 시간이 많이 걸린다.


ArrayList에 어떠한 클래스 든 다 저장하고 싶은 경우

참조
ArrayList에 넣고 싶은 자료형에 따라 Generic에 Class를 넣어줘야하는데, Generic에 Object로 넣을 경우
모든 데이터 타입을 다 집어 넣을 수 있게 된다.

 

예시

import java.util.ArrayList;
import java.util.LinkedList;

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

		ArrayList<Object> arraylist = new ArrayList<Object>();
	}
}

 

 

add(요소) : ArrayList 요소 추가

		// 추가
		arraylist.add("red");

		String str = new String("blue");
		arraylist.add(str);

		arraylist.add(new String("green"));



add(index, 요소) : ArrayList 원하는 위치에 요소 추가

 		// 원하는 위치에 추가(중간)
		String num = new String("yellow");
		arraylist.add(1, num);

		arraylist.add(1, "yellow");

 

set(index, 요소) : ArrayList 원하는 위치에 요소 수정

		// arraylist 수정
		arraylist.set(2, "black");

 

remove(index) : ArrayList 원하는 위치에 요소 삭제

		// 0번째 삭제
		arraylist.remove(0);

 

indexOf(검색 요소) : ArrayList index번호 검색

		// yellow의 index의 번호
		int index = arraylist.indexOf("yellow");

 

size() : ArrayList 길이

		// arraylist 길이
		int len = arraylist.size();

 

ArrayList 전체 출력

		// foreach문 사용	
		System.out.println("arraylist");
		for (Object ob1 : arraylist) {
			System.out.print((String) ob1+"\t");
		}

 

LinkedList에 ArrayList 복제하기

참조
LinkedList는 ArrayList와 호환 가능하다.
원본(arraylist)에 영향을 주지 않습니다.

형식
LinkedList <자료형> linklist = new LinkedList <자료형>(arraylist명);

예시

		// ArrayList와 호환 가능!
		// Generic은 같은형으로 잡아주고 생성자 안에 ArrayList명을 넣어준다.

		LinkedList<Object> linklist = new LinkedList<Object>(arraylist);



addLast(요소) : linklist 맨뒤에 요소 추가 / addFirst(요소) : 맨 앞에 요소 추가

참조
 ArrayList는 index를 지정하여 요소를 추가할 순 있지만 linklist처럼 맨 앞이나 맨뒤에 요소를 추가할 수 없다.

예시

 		// 맨 뒤에 요소(element)를 추가
		linklist.addLast("sleap");
		
		// 맨 앞에 요소(element)를 추가
		linklist.addFirst(1);




위 코드의 전체 코드입니다.

import java.util.ArrayList;
import java.util.LinkedList;

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

		ArrayList<Object> arraylist = new ArrayList<Object>();

		// 추가
		arraylist.add("red");

		String str = new String("blue");
		arraylist.add(str);

		arraylist.add(new String("green"));

		// 원하는 위치에 추가(중간)
		String num = new String("yellow");
		arraylist.add(1, num);

		arraylist.add(1, "yellow");

		// foreach문 사용	
		System.out.println("arraylist");
		for (Object ob1 : arraylist) {
			System.out.print((String) ob1+"\t");
		}
		System.out.println();
		System.out.println();
		// 삭제
		// 0번째 삭제
		arraylist.remove(0);

		// 검색
		// yellow의 index의 번호
		int index = arraylist.indexOf("yellow");



		// ArrayList와 호환 가능!
		// Generic은 같은형으로 잡아주고 생성자 안에 ArrayList명을 넣어준다.

		LinkedList<Object> linklist = new LinkedList<Object>(arraylist);

		// linklist 전체 출력문
		System.out.println("linklist");
		for (Object ob : linklist) {
			System.out.print((String) ob+"\t");
		}
		System.out.println();
		System.out.println();
		
		// 맨 뒤에 요소(element)를 추가
		linklist.addLast("sleap");
		
		// 맨 앞에 요소(element)를 추가
		linklist.addFirst(1);
		
		// arraylist 수정
		arraylist.set(2, "black");
		
		// arraylist 길이
		int len = arraylist.size();
		
		// arraylist 전체 출력문
		System.out.println("linklist에 요소 추가 후 arraylist");
		for (Object ob1 : arraylist) {
			System.out.print((String) ob1+"\t");
		}
		System.out.println();
		System.out.println();
		
		// linklist 전체 출력문
		System.out.println("요소 추가 후 linklist");
		for (Object ob : linklist) {
			System.out.print((Object) ob+"\t");
		}
	}
}



실행화면

arraylist
red	yellow	yellow	blue	green	

linklist
yellow	yellow	blue	green	

linklist에 요소 추가 후 arraylist
yellow	yellow	black	green	

요소 추가 후 linklist
1	yellow	yellow	blue	green	sleap

 

'IT > Java' 카테고리의 다른 글

JAVA 용어정리  (0) 2021.09.16
[자바] jsoup을 이용하여 웹 크롤링 구현하기  (0) 2021.07.20
[자바] 상속/오버라이딩  (0) 2021.06.01
[자바] 싱글톤(Sington)  (0) 2021.05.31
[자바] 파일 쓰기  (0) 2021.05.26

상속(Inheritance)이란?

정의
 부모의 모든 것을 자식에게 상속하는 것 ( == 사용할 수 있게 하는 것)

형식
 클래스 자식 클래스명 extends 부모 클래스명
         ex) class Strawberry extends Fruit 

참조
 상속 관계에선 Overriding을 할 수 있다.

 

 

오버라이딩(overriding)이란 ? : 덮어쓴다.

정의
 상속받은 조상의 메서드를 자신에 맞게 변경하는 것

 

참조
 선언부 변경불가. 내용만 변경가능

조건
 1. 선언부가 조상 클래스의 메서드와 일치해야 한다.
   : 선언부(반환타입, 메서드이름, 매개변수 목록)
 2. 접근제어자를 조상 클래스의 메서드보다 좁은 범위로 변경할 수 없다.
 3. 예외는 조상 클래스의 메서드보다 많이 선언할 수 없다.

예시

class Fruit { // 부모class 생성
	String name;
	Fruit(String name){
		super(); // 생략된 것 (부모는 Object)
		this.name = name;
	}
	void color() {
		System.out.println(" 노란색");
	}
	void p(String str) {
		System.out.print(str);
	}
	void pln(String str) {
		System.out.println(str);
	}
}

class Strawberry extends Fruit { // 자식class 생성
	int count;
	Strawberry(String name, int count){
		super("딸기");
		this.count = count;
	}
	void color() { // 부모메소드 오버라이딩
		System.out.print(" 빨간색");
	}
	void action() {
		System.out.println("이다.");
	}
}
public class User {

	public static void main(String[] args) {
		Fruit f = new Fruit("바나나");
		f.p(f.name+"는");
		f.color();
		
		Strawberry s = new Strawberry("딸기", 10);
		s.p(s.name+"는");
		s.color(); 
		s.action(); 
		s.pln(s.count+"개 정도 먹고싶다.");
		
		Fruit f3 = new  Strawberry("바나나", 12); // 다형성
		
		Fruit f1 = s; // 부모 -> 자식 (자동형변환)
		f1.p(f1.name+"는 ");
		f1.color();  
	/*  f1.action(); 
		f1.pln(f1.count+"개 정도 먹고싶다."); */
		f.pln("");
		
		Strawberry s1 = (Strawberry) f1; // 자식 -> 부모 (강제형변환) 다 쓸 수 있다.
		s1.p(s1.name+"는");
		s1.color(); 
		s1.action(); 
		s1.pln(s1.count+"개 정도 먹고싶다.");
		
	/*	Strawberry s2 = (Strawberry) f; // 잘못된 강제형변환	ClassCastException (원래 부모인데 자식에 끼어맞추면 깨져버린다.)
		s2.p(s.name+"는");								RunTimeError (컴파일은 되는데 실행이 안된다.)
		s2.color(); 
		s2.action(); 
		s2.pln(s.count+"개 정도 먹고싶다."); */
	}
}

 

참조
 형변환은 상속관계에서만 가능하다.
  자동형변환( 자식 → 부모 ) → 묵시적
    : overroding유지, 부모 객체만 호출 가능.
  강제형변환( 부모 → 자식 ) → 명시적
    : overroding유지, 자식 객체 호출 가능.
  잘못된 강제 형 변환은 RuntimeException를 발생시킨다. 컴파일은 가능, 실행 불가.


실행화면

바나나는 노란색
딸기는 빨간색이다.
10개 정도 먹고싶다.
딸기는  빨간색
딸기는 빨간색이다.
10개 정도 먹고싶다.

싱글톤패턴이란?

정의

생성자가 여러 차례 호출되더라도 실제로 생성되는 객체는 하나이고 최초 생성 이후에 호출된 생성자는 최초의 생성자가 생성한 객체를 리턴한다. 이와 같은 디자인 유형을 싱글턴 패턴이라고 한다. 

 

참조
주로 공통된 객체를 여러개 생성해서 사용하는 DBCP(DataBase Connection Pool)와 같은 상황에서 많이 사용된다.

 

예시

public class SingletonClass {

	private static SingletonClass si = null;
    	public int s_num;
	private SingletonClass() {}
    
	public static SingletonClass getInstance() {
		if(si == null) {
			si = new SingletonClass();
		}
		return si;
	}
}        

 

싱글톤패턴 사용 이유 

한번의 객체 생성으로 객체를 재사용 함으로써 메모리 낭비 방지

데이터 공유의 편리성

 

다른 클래스에서 접근 예시

public class MyClass {
	private int number;
	
	public MyClass() {
		number = 256;
	}

	public int getNumber() {
		return number;
	}
	// SingletonClass 객체 생성
	public void method() {
		SingletonClass si = SingletonClass.getInstance();
		si.s_num = number; // 대입 0 <- 256
	}
}

 

출처 : 위키백과

 

파일 쓰기

 

java.io.Writer.write

 

참조

 개행이 불가하여 잘 사용하지 않는다.

 개행을 하기 위해선 \n를 사용하여야 한다.

 추가 쓰기 시 생성자 파라미터 안에 ture를 넣어준다.

 파일 입력이 종료되면 close() 필수!

 파일 안에 내용이 있어도 경고문이 뜨지 않으니 주의하여야 한다.

 

java.io.PrintWriter.println

 

참조

 개행 가능!

 파일 입력이 종료되면 close() 필수!

 파일 안에 내용이 있어도 경고문이 뜨지 않으니 주의하여야 한다.

 

예시

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;

public class MainClass {
	public static void main(String[] args)throws IOException {
		
		File file1 = new File("d:\\tmp\\newfile1.txt");
		
		FileWriter fwriter;
		
		
		// 쓰기 
		fwriter = new FileWriter(file1);
		fwriter.write("hello" + "\n");
		fwriter.write("안녕하세요");
		fwriter.close();
				
		// 추가
		fwriter = new FileWriter(file1, true);
		fwriter.write("반갑습니다");		
		fwriter.close();
		
		File file2 = new File("d:\\tmp\\newfile2.txt");
		// 개행 쓰기		
		PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter(file2)));
		pw.println("안녕하세요");
		pw.println("hello");
		pw.println("반갑습니다");
		pw.close();
		
		
	}

 

 

파일 확인

파일에 잘 입력된 걸 볼 수 있다.

'IT > Java' 카테고리의 다른 글

[자바] 상속/오버라이딩  (0) 2021.06.01
[자바] 싱글톤(Sington)  (0) 2021.05.31
[자바] 파일 읽기  (0) 2021.05.16
[자바] File Class  (0) 2021.05.16
[자바] Calendar Class  (0) 2021.05.13

파일 내용 읽기

 

java.io.InputStreamReader.read()

 

참고

 1 글자씩 읽기

 반환형이 int형이라 출력문 사용 시 한문자씩 받기 위해 char형으로 변환해 주어야 한다.

 while문을 사용하여 ch!= -1이라는 조건을 사용한다.

 사용 시 IOException이 발생한다. 필자는 메인 메서드에 throws 하였다.

 

 

 

java.io.BufferedReader.readLine()

 

참고

 1 문장씩 읽기

 while문 사용 시!= null을 사용하여야 한다.

 사용 시IOException이 발생한다. 필자는 메인 메서드에 throws 하였다.

 

예시

import java.io.*;

public class FileRead {
	public static void main(String[] args) throws Exception {
		
		File file = new File("d:\\File class test\\myfile.txt");
		
		// 한글자씩 읽기
		FileReader fr = new FileReader(file);
		int ch = fr.read();
		// 한문자씩 읽어올때 더 이상 불러올 문자가 없으면 -1
		while(ch != -1) { // 더이상 뱉어낼꺼 없을땐 -1
			System.out.println((char)ch);
			ch = fr.read();
		}
		fr.close();

		// 한문장씩 읽기	Buffer(=저장공간)
		BufferedReader br = new BufferedReader(new FileReader(file));
		String str;
		// 한문장씩 읽어올때 더 이상 불러올 문장이 없으면 null
		while((str = br.readLine()) != null) {
			System.out.println(str);
		}
		br.close();
		
	}
}

 

실행화면

안
녕
하
세
요
반
갑
습
니
다
안
녕
하
세
요
안녕하세요
반갑습니다
안녕하세요

 

 

'IT > Java' 카테고리의 다른 글

[자바] 싱글톤(Sington)  (0) 2021.05.31
[자바] 파일 쓰기  (0) 2021.05.26
[자바] File Class  (0) 2021.05.16
[자바] Calendar Class  (0) 2021.05.13
[자바] String Class  (0) 2021.05.11

java.io.File 클래스

입출력에 필요한 파일 및 디렉터리에 관한 정보를 다를 수 있다.

 

 

list() : 해당 디렉터리의 파일 출력 방법

 

예시

import java.io.*;

public class FileIO {
	public static void main(String[] args) {
		File file = new File("d:\\");
		//디렉토리 파일 출력
		String filelist[] = file.list();
		for (int i = 0; i < filelist.length; i++) {
			System.out.println(filelist[i]);
		}

필자의 D드라이브에는 다음과 같은 파일이 있습니다

 

실행화면 

 숨겨진 파일까지 보이는 것을 확인할 수 있습니다.

$RECYCLE.BIN
File class test
Programs
STUDY
System Volume Information
카카오톡 받은 파일

 

 

 

listFiles() : 해당 디렉터리의 파일 출력 및 파일인지 폴더인지 조사

 

예시

		File filelist2[] = file.listFiles();
		for (int i = 0; i < filelist2.length; i++) {
			if(filelist2[i].isFile()) { // 파일일 경우
				System.out.println("[파일]"+ filelist2[i].getName());
			}else if(filelist2[i].isDirectory()) { // 폴더일 경우
				System.out.println("[폴더]"+ filelist2[i].getName());
			}else {
				System.out.println("[?]"+ filelist2[i].getName());
			}
		}

필자의 D드라이브에는 다음과 같은 파일이 있습니다

 

실행화면

 list()와는 달리 listFiles()는 파일인지 폴더인지 구별하여 출력하여 줍니다.

[폴더]$RECYCLE.BIN
[폴더]File class test
[파일]File class test.txt
[폴더]Programs
[폴더]STUDY
[폴더]System Volume Information
[폴더]카카오톡 받은 파일

 

 

 

createNewFile() : 파일 생성

참고

 해당 메서드는 이름이 같은 파일이 있을 경우 파일을 생성하지 않습니다.

 

예시

		File newfile = new File("d:\\newfile.txt");
		
		try {
			if(newfile.createNewFile()) {
				System.out.println("파일 생성 성공!!");
			}else {
				System.out.println("파일 생성 실패");
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
		

 

이름이 같은 파일이 없는 경우 실행화면

파일 생성 성공!!

 

mkdirs() : 폴더 생성

참고

 해당 메소드는 이름이 같은 파일이 있을 경우 파일을 생성하지 않습니다.

 하위 디렉터리까지 생성이 가능합니다.

 

예시

		File newDir = new File("d:\\tmp1\\subDir");
		if(newDir.mkdirs()) {
			System.out.println("폴더 생성 성공");
		}else {
			System.out.println("폴더 생성 실패");
		}
		

 

 

 

exists() : 지정한 경로에 디렉터리 & 파일의 존재 여부 확인

 

예시

		if(newfile.exists()) {
			System.out.println("newfile.txt 파일이 존재합니다");
		}

 

 

 

setReadOnly() : 읽기 전용(파일 보존)

 

예시

		newfile.setReadOnly();

 

 

 

delete() : 파일 삭제

 

예시

		newfile.delete();
	}
}

 

 

 

'IT > Java' 카테고리의 다른 글

[자바] 파일 쓰기  (0) 2021.05.26
[자바] 파일 읽기  (0) 2021.05.16
[자바] Calendar Class  (0) 2021.05.13
[자바] String Class  (0) 2021.05.11
[자바] Java 예약어(keyword, reserved word)  (0) 2021.04.24

java.util.Calendar 클래스

날짜 시간 -> 일정관리에 주로 사용됩니다.

 

오늘 날짜 보기

참고

 사용 시 주의할 점은 Calendar.MONTH는 기본 설정이 0~11이기 때문에 +1을 해주어야 1~12가 된다.

 

예시

import java.util.*;

public class CalendarClass {
	public static void main(String[] args) {
		
		// Calendar cal = new GregorianCalendar();  ← 객체 생성 가능은하지만 잘 사용하지 않는다.
		
		Calendar cal = Calendar.getInstance();

		// 오늘 날짜 취득(getter)
		int year = cal.get(Calendar.YEAR);
		int month = cal.get(Calendar.MONTH)+1;	// 0 ~ 11
		int day = cal.get(Calendar.DATE);
		
		System.out.println(year+"년"+month+"월"+day+"일");

 

실행화면

2021년5월13일

 

 

 

 

 

날짜 지정 방법

참고

 Calendar.MONTH에 날짜 지정 시에는 +1을 할 필요가 없다!

 

예시

		// 날짜 설정(setter)
		cal.set(Calendar.YEAR, 2021);
		cal.set(Calendar.MONTH, 4);
		cal.set(Calendar.DATE, 5);
		
		year = cal.get(Calendar.YEAR);
		month = cal.get(Calendar.MONTH);
		day = cal.get(Calendar.DATE);
		
		System.out.println(year+"년"+month+"월"+day+"일");

 

실행화면

2021년4월5일

 

 

 

 

 

Calendar.AM_PM : 오전인지? 오후인지?

참고

 'Calendar.AM_PM'메서드에 삼항 연산자를 사용하여 확인한다!

 

예시

		// 오전/오후
		String ampm = cal.get(Calendar.AM_PM) == 0?"오전":"오후";
		//		               (조건)     ?"true":"false"
		System.out.println(ampm);

 

 

 

Calendar.DAY_OF_WEEK : 무슨 요일 인지 확인!

참고

 사용시 주의할 점은 Calendar.DAY_OF_WEEK == 1(일요일) ~ 7(토요일)

 switch ~ case문 사용하였다.

 

예시

		// 요일 1(일) ~ 7(토)
		int weekday = cal.get(Calendar.DAY_OF_WEEK);
		switch(weekday) {
		case 1:
			System.out.println("일요일");
			break;
		case 2:
			System.out.println("월요일");
			break;
		case 3:
			System.out.println("화요일");
			break;
		case 4:
			System.out.println("수요일");
			break;
		case 5:
			System.out.println("목요일");
			break;
		case 6:
			System.out.println("금요일");
			break;
		case 7:
			System.out.println("토요일");
			break;
		}
		
		int lastday = cal.getActualMaximum(Calendar.DAY_OF_MONTH);
		System.out.println("이번달의 마지막 날:"+lastday);
		
	}
}

 

실행화면

목요일

 

 

 

'IT > Java' 카테고리의 다른 글

[자바] 파일 읽기  (0) 2021.05.16
[자바] File Class  (0) 2021.05.16
[자바] String Class  (0) 2021.05.11
[자바] Java 예약어(keyword, reserved word)  (0) 2021.04.24
[자바] beginning  (2) 2021.04.23

+ Recent posts