Clean & Blue 자세히보기

전공/전공 마스터리

자바 프로그래밍 공부하면서 정리한 개념 및 구문, 메소드들

_청렴 2022. 1. 13. 01:53
반응형

자바 프로그래밍 기초


- 자바 환경변수 설정

내PC(속성) -> 고급 시스템 설정 -> 고급 -> 환경변수

JAVA_HOME : 자바 설치 경로

PATH : 자바 설치 경로/bin 

 

- 온라인 자바 API 참조 링크

http://docs.oracle.com./javase/8/docs/api

 

Java Platform SE 8

 

docs.oracle.com

 

- CMD에서 자바 컴파일 및 실행

 

- 하나의 클래스 파일에는 하나의 public 클래스가 존재함

클래스 파일의 이름과 public 클래스의 이름이 동일해야함

 

- Scanner 객체 

Scanner sc = new Scanner(System.in);

 

- for 문

		for(int i=1; i<10; i++, System.out.println())
			System.out.println(i);

이렇게도 쓸 수 있음

 

- for~each 문

배열이나 나열의 각 원소를 순차적으로 접근하는 데 유용

		int[] num = {1,2,3,4,5};
		
		for(int i : num)
			System.out.println(i);

 

- 나열 타입 enum

	enum Week {월, 화, 수, 목, 금, 토, 일}
	// main 밖에 정의 해야함
	public static void main(String[] args)
	{
		for( Week day : Week.values())
			System.out.print(day);

 

- 배열 선언

		int[] intArray1; //또는
		int intArray2[];
		
		int[] intArray3 = new int[5]; //선언과 동시 생성
		int[] intArray4 = {1, 2, 3, 4, 5}; //선언과 동시 초기화

주요 메소드

int length() : 배열의 길이(원소의 개수)

 

- 비정방형 배열

		int intArray[][] = new int[4][];
		intArray[0] = new int[3];
		intArray[1] = new int[2];
		intArray[2] = new int[4];
		intArray[3] = new int[3];

 

- Scanner 키보드로 입력 받기

import java.util.Scanner;
Scanner in = new Scanner(System.in);
		
		while(true)
		{
			if(in.nextInt() == -1) //
				break;
		}

주요 메소드

String next() : 다음 문자열 리턴

byte nextByte() : 다음 바이트값 리턴

int nextInt() : 다음 정수값 리턴

float nextFloat() : 다음 실수값 리턴

double nextDouble() : 다음 배정도형 실수 값 리턴

Stirng nextLine() : '\n' 까지의 문자열을 리턴(\n은 미포함하여 리턴함)

 

- 예외 처리

		try
		{
			// 예외가 발생할 수 있는 실행문
		} 
		catch(//처리할 예외 타입)
		{
			// 예외 처리문
		} 
		finally
		{
			// 예외 발생 여부와 상관없이 실행할 문장
		}

 

 

자바 객체와 상속


- 객체지향 언어의 특성 : 캡슐화, 상속, 다형성

 

- 접근 지정자

슈퍼 클래스 멤버에 접근하는 클래스 종류 슈퍼 클래스 멤버의 접근 지정자
default private protected public
같은 패키지의 클래스 o x o o
다른 패키지의 클래스 x x x o
같은 패키지의 서브클래스 o x o o
다른 패키지의 서브클래스 x x o o

 

- 기본 생성자

아무런 생성자를 정의 하지 많으면 자동으로 기본생성자를 만들어주나

다른 생성자가 있다면 기본 생성자를 만들어 주지 않음

다른 생성자가 있음에도 불구하고 기본생성자로 객체를 생성할 경우 컴파일 오류 발생

 

- 오버로딩

한 클래스 내에서 동일한 이름을 가지지만 다른 기능을 하는 메소드나 생성자를 만드는 것

 

- 오버라이딩

상속 관계를 갖는 다른 클래스 내에서 동일한 이름을 가지지만 다른 기능을 하는 메소드나 생성자를 만드는것

static, private, final로 선언된 메소드는 오버라이딩 할 수 없다.

 

- this와 this()

this는 현제 메소드가 속한 클래스의 레퍼런스

this()는 생성자 안에서만 사용할 수 있으며 동일한 클래스 내의 다른 생성자를 호출할 때 사용

 

- static 멤버 및 메소드

C/C++에서의 전역 변수와 같은 맥락

객체의 선언 없이 클래스.static멤버 와 같이 바로 사용할 수 있음

static 메소드에서는 this 객체를 사용할 수 없음

 

-final

final 클래스 : 해당 클래스를 상속 받을 수 없음

final 메소드 : 해당 메소드를 오버라이딩 할 수 없음

final 필드 : 상수 정의, 선언 시 초기값 지정 필요

 

- super와 super()

super는 슈퍼 클래스에 대한 레퍼런스

super()는 상속 받은 서브 클래스의 생성자에서 명시적으로 슈퍼 클래스의 생성자를 선택할 수 있음

반드시 생성자 코드의 첫 라인에 와야 함

 

- 업캐스팅

서브 클래스 객체가 슈퍼 클래스 타입으로 변환되는 것

		Person p;
		Student s = new Student();
		p = s; // 업캐스팅 발생

결론적으로 업캐스팅 되면 슈퍼 클래스 내의 멤버만 접근할 수 있음

 

- 다운캐스팅

업캐스팅된 객체를 다시 원래대로 되돌리는 것

명시적으로 타입을 지정해주어야 함

		 s = (Student)p;

- instanceof 연산자

이항 연산자임

업캐스팅된 객체의 진짜 타입이 뭔지 궁금할 때 사용

결과값은 true 아니면 flase

		 if ( s instanceof Student)

 

- 추상 메소드 

메소드의 프로토타입만 있고 실행 코드를 작성하지 않은 미완성의 메소드, 메소드 이름 앞에 abstract 선언 필요

 

- 추상 클래스

abstract로 선언된 클래스

추상 메소드를 한개 이상 포함하는 경우 반드시 추상 클래스로 선언

그러나 추상 메소드가 없더라고 추상 클래스로 선언할 수 있음

그래도 객체 생성 시 getInstance 메소드로 인스턴스 생성 가능

 

- 인터페이스

일종의 추상 클래스로서 추상메소드와 상수만 포함

interface 라는 키워드로 선언

서브클래스가 인터페이스를 구현(상속)할 때 implements 키워드 사용

여러 개의 인터페이스를 상속 가능(다중 구현)

구현 시 인터페이스의 모든 메소드를 구현해야함

 

 

자바 기본 패키지


- 모든 클래스는 Object클래스의 서브 클래스

주요 메소드

boolean equals() : 비교해서 같으면 true 리턴

class getClass() : 현 객체의 런타임 클래스를 리턴

int hashCode() : 현 객체에 대한 해시 코드 값 리턴

String toString() : 현 객체에 대한 스트링 표현을 리턴 -> sysout.print 를 만났을 때 자동으로 실행되는 메소드로 클래스 생성시 오버라이딩이 가능하다.

void wait() : 다른 스레드가 깨울 때가지 현재 스레드를 대기하게 함

 

- Wrapper 클래스

자료형을 객체로서 사용할 수 있게끔 준비된 클래스들

Integer 클래스의 주요 메소드

float floatValue() : float타입으로 변환된 값 리턴

int intValue() : int타입으로 변환된 값 리턴

static int parseInt(String s) : String s를 10진 정수로 변환된 값 리턴

static int parseInt(String s, int radix) : String s를 지정된 진법의 정수로 변환된 값 리턴

static String toString(int i) : 인자 i를 스트링으로 변환하여 리턴

static String toBinaryString(int i) : 인자 i를 이진수 표현으로 변환된 스트링 리턴

 

- 박싱과 언박싱

기본 데이터 타입을 Wrapper 클래스로 변환하는 것을 박싱

반대의 경우를 언박싱이라 함

 

- String 클래스

		String a = new String("abcd");

주요 메소드

char charAt(int index) : 지정된 인덱스에 있는 문자 값 리턴

int codePointAt(int index) : 지정된 인덱스에 있는 유니코드값 리턴

int compareTo(String anotherString) : 두 스트링을 비교

String concat(String str) : str 스트링을 현재 스트링 뒤에 덧붙임

boolean contains(CharSequence s) : s에 지정된 일련의 문자들을 포함하고 있으면 true 리턴

int length() : 스트링 길이

String replace(Charsequence target, Charsequence replacement) : target이 지정하는 일련의 문자들을 replacement가 지정하는 문자들로 변경

String[] split(String regex) : 정규식 regex에 일치하는 부분을 중심으로 스트링을 분리하고 분리된 스트링을 배열에 저장하여 리턴

String trim() : 문자열 앞과 뒷부분에 있는 공백문자를 제거한 문자열 리턴

String substring(start index, end index) : 시작점부터 종점까지의 문자열을 잘라낸다.

 

- StringBuffer 클래스 : 문자열이 길어서 작업이 많을 경우 활용 적합

		StringBuffer sb = new StringBuffer("java");

StringBuffer append(String str) : str을 스트링 버퍼에 덧붙임

StringBuffer append(StringBuffer sb)

int capacity() : 버퍼 크기

stringBuffer delete(int start, int end) : start에서 end가지 지움

StringBuffer insert(int offset, String str) : offset위치에 삽입

StringBuffer replace(int start, int end, String str) 

StringBuffer reverse()

void setLength(int newLength) : 버퍼 길이 재설정

 

- StringTokenizer 클래스

		StringTokenizer st = new StringTokenizer("abcd&efg", "&", "true");
        //세번째 인자는 딜리미터까지 토큰으로 반환할건지 정하는 인자

int countTokens() : 토큰 개수

boolean hasmoreTokens() : 다음 토큰이 있는지

String nextToken() : 다음 토큰 리턴

 

- Math 클래스를 활용한 난수 생성

		for(int i=0; i<10; i++)
		{
			double d = Math.random()*100; // random()는 0에서 1까지의 실수 랜덤발생
			int n = (int)(Math.round(d)); // 반올림한 정수를 리턴
			System.out.println(n);
		}

 

- Calendar 클래스

get()과 set() 메소드로 얻을 수 있는 필드 표

필드 의미 필드 의미
YEAR 년도 DAY 한 달의 날짜
MONTH DAY_OF_WEEK 한 주의 요일
HOUR 0-11시로 표현한 시간 AP_PM 오전, 오후
HOUR_OF_DAY 24시간 기준 시간 MINUTE
SECOND MILLISECOND 밀리초

추상클래스이기 때문에 Calendar.getInstance() 메소드로 객체 생성

 

 

제네릭과 컬랙션


- 제네릭은 요소로 객체들만 넣을 수 있음

 

- Vector<E>

		Vector<Integer> v = new Vector<>();

주요 메소드

boolean add(E element)

void add(int index, E element)

int capacity() : 벡터 현재 용량 

boolean addAll(Collection<? extends E> c) : 컬렉션 c의 모둔 요소를 벡터 맨 뒤에 추가

clear()

boolean contains(Object o)

E elementAt(int index) : 인덱스의 요소 리턴

E get(int index) : 위와 같음

int indexOf(Object o)

isEmpty()

E remove(int index)

boolean remove(Object o)

void removeAllElements()

int size() : 벡터의 요소 개수 리턴

Object[] toArray() : 벡터의 모든 요소를 포함하는 배열 리턴

 

- ArrayList<E>

가변 크기의 배열을 구현한 컬렉션 클래스

벡터와 모든 메소드 동일

벡터와 다르게 null도 삽입 가능

 

- iterator 

컬렉션의 순차 검색을 위함

Vector, ArrayList, LinkedList, Set 과 같은 리스트 모양의 컬렉션에서 요소를 순차 검색(HashMap을 먼저 Set으로 뽑은 후에 사용함)

		Vector<Integer> v = new Vector<>();
		Iterator<Integer> it = v.iterator();

주요 메소드

boolean hasNext()

E next()

void remove()

 

- HashMap<K, V>

키와 값의 쌍으로 구성되는 요소를 다룸

해시맵은 순서가 없음

주요 메소드

clear()

boolean containsKey(Object key)

boolean containsValue(Object value)

V get(Object key)

isEmpty()

Set<K> keySet() : 해시맵에 있는 모든 키를 담은 Set<k> 컬렉션 리턴

V put(K key, V value)

V remove(Object key)

int size() : 해시맵 요소 개수 리턴

		HashMap<String, String> dic = new HashMap<>();
		Set<String> keys = dic.keySet(); // iterator를 사용하기 위해 키셋을 뽑아서
        // Set 컬렉션으로 만듬
		Iterator<String> it = keys.iterator();

 

- LinkedList<E>

ArrayList와 유사하지만 head와 tail에 대한 레퍼런스가 있고 양 끝이 연결되어 있음

 

- Collections 클래스 

static 메소드이므로 바로 사용할 수 있음

주요 메소드

sort()

reverse()

max(), min()

binarySearch()

 

 

파일 입출력과 스트림


- 파일 읽기 FileInputStream : 바이트 단위로 파일을 읽음 -> 바이너리, 이미지 처리 가능

InputStream에서 상속 받은 클래스

		try 
		{
			FileInputStream fin = new FileInputStream("c:\\test.txt"); // 자바는 \를 특수문자로 
            // 사용하기 때문에 \문자를 사용하고자 한다면 \\와 같이 두번 사용하도록 함
		
			int c;
			while ((c = fin.read()) !=-1) // -1은 EOF 이다.
            // 실제 -1을 읽을 경우 문제가 있을 것 같으나 실제 -1 은 32비트로 FFFFFFFF이기 
            //때문에 EOF와 구분된다.
			{
				System.out.print((char)c);
			}
		} catch (IOException e)
		{
			System.out.println("입출력 오류");
		}

주요 메소드

int read() : 입력 스트림에서 한 바이트를 읽어 int 형으로 리턴

int read(byte[] b)

int read(byte[] b, int off, int len)

void close() 

 

- 파일 쓰기 FileOutputStream : 바이트 단위로 파일을 씀

OutputStream 클래스에서 상속 받은 클래스

주요 메소드

		try 
		{
			FileOutputStream fout = new FileOutputStream("c:\\test.out");
			// 경로에서 백슬래시는 항상 두번 써야 인식됨
            // 파일 쓰기를 할 경우 윈도우 쓰기 권한이 있어야 함
			for(int i=0; i<10; i++)
			{
				fout.write(i);
			}
			fout.close();
		} catch (IOException e)
		{
			System.out.println("입출력 오류");
		}

write()

flush() : 출력 스트림에 남아있는 모든 데이터 출력

close()

 

- 실제 -1 과 EOF(-1) 은 32비트로 표현할 경우 엄연히 다르다.

 

- FileReader

2바이트 문자 단위로 파일을 읽음(이미지, 바이너리 등 파일 처리 불가)

주요 메소드

int read()

boolean ready() : 입력 스트림이 문자를 읽어들일수 있는 상태인지

String getEncoding() : 스트림이 사용하는 문자 집합의 이름 리턴

reset() : 스트림 리셋, 마킹되어 있으면 그 위치부터 시작

close()

 

- FileWriter 

문자 단위로 파일을 씀

주요 메소드 

write()

flush()

getEncoing()

close()

 

- InputStreamReader

2바이트 문자 단위로 파일을 읽음, 먼저 FileInputStream 객체를 선언 후 이용해야함

문자 집합을 설정할 수 있음 - 아스키, 유니코드, utf-8, ms949 등

한글 문자를 처리하기 위해 필요한 클래스

		FileInputStream fin = null;
		InputStreamReader in = null;
		try 
		{
			fin = new FileInputStream("c:\\windows\\system.ini");
			in = new InputStreamReader(fin, "UTF-8");
			int c;
			
			while ((c=in.read()) != -1)
				System.out.print((char)c	);
			
			in.close();
			fin.close();
		} catch (IOException e)
		{
			System.out.println("입출력 오류");
		}

 

- OutputStreamWtriter

2바이트 문자 단위로 파일을 씀

문자 집합을 설정할 수 있음

주요 생성자

OutputStreamWriter(OutputStream out, Charset cs)

 

- 버퍼 입출력 스트림

버퍼 스트림 클래스의 생성자는 모두 바이트 스트림 또는 문자 스트림과 연결하여 사용

일일히 운영체제 API를 호출하는 것보다 시스템의 부담을 줄일 수 있음

주요 생성자

BufferedInputStream(InputStream in, int size)

BufferedOutputStream(OutputStream out, int size)

BufferdRreader(Reader in, int size)

BufferedWriter(Writer out, int size)

			InputStreamReader in = new InputStreamReader(System.in);
			BufferedOutputStream out = new BufferedOutputStream(System.out, 5);
			try
			{
				int c;
				
				while((c=in.read()) != -1)
				{
					out.write(c);
				}
				out.flush();
				in.close();
				out.close();
			} catch (IOException e)
			{
				System.out.println("입출력 오류");
			}

 

- File 클래스

주요 메소드

boolean mkdir()

String[] list() : 디렉터리 내의파일과 디렉터리 이름의 문자열 배열 리턴

File[] listFiles() : 디렉터리내의 파일 이름을 File 배열로 리턴

boolean renameTo(File dest)

boolean delete()

long length() : 파일 크기 리턴

String getPath() : 파일 경로명 전체 리턴

String getName() : 파일 또는 디렉토리 이름 리턴

boolean isFile()

boolean isDirectory()

long lastModified() : 파일이 마지막으로 변경된 시간 리턴

boolean exists() : 파일 또는 디렉터리가 존재하면 true 리턴

 

 

자바 GUI 기초, AWT와 스윙


 

- 컨테이너와 컴포넌트

컨테이너란 다른 컴포넌트를 포함할 수 있는 특별한 GUI 컴포넌트

-> JFrame, JPanel, JApplet, JDialog, JWindow

-> 컨테이너 또한 컴포넌트이기에 컨테이너 안에 들어 갈 수 있음

 

- AWT, 스윙 관련 import 할것

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;

 

- JFrame 만들때 권장 사항(main 위치)

public class totistory extends JFrame //JFrame 상속
{
	public totistory()
	{
		setTitle("첫번째 프레임");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //윈도우 닫기 버튼 눌렀을때 완전 종료하기
        // 위한 메소드
		setSize(300, 300);
		setVisible(true); // true를 넣어야 실제 화면에 보여진다. 없으면 아무것도 화면에 안뜸
	}
	
	public static void main(String[] args) // 어차피 계속 떠있을 프레임이기 때문에 메인을 
    // 안에 넣어도 상관없음
	{
		totistory Myframe = new totistory();
	}
}

 

- JFrame 만들 때 이렇게 해도되나 권장되지는 않음

class MyFrame extends JFrame // JFrame 클래스를 따로 만들어도 됨
{
	public MyFrame()
	{
		setTitle("첫번째 프레임");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setSize(300, 300);
		setVisible(true);
	}
}
public class totistory
{
	public static void main(String[] args)
	{
		MyFrame Myframe = new MyFrame();
	}
}

 

- JFrame은 프레임, 메뉴바, 컨텐트팬 3개로 구성되어 있음

컴포넌트를 달기 위해선 컨텐트팬에 부착해야 함

따라서 아래와 같이 컨텐트팬을 알아내야 함

	Container c = getContentPane();
	c.add(new JButton("Hi"));

하지만 JDK 1.5 이후부터는 프레임 자체에 add를 해도 알아서 컨텐트팬에 붙여줌. 따라서 아래와 같이 써도 되나 내부적으로 동작하는건 똑같음

		MyFrame Myframe = new MyFrame();
		Myframe.add(new JButton("Hi"));

 

- 모든 컨테이너는 하나의 배치관리자를 가져야함

배치관리자의 종류는 크게 FlowLayout, BorderLayout, GridLayout 등이 있다.

아래와 같이 setLayout 메소드를 이용해 설정함

		Container c = getContentPane();
		c.setLayout(new FlowLayout(FlowLayout.LEFT, 30, 40));
		c.add(new JButton("hi"));

 

- JFrame의 setVisible(true) 메소드는 맨 아래에 적어주어야 컴포넌트들이 화면에 나타남

컴포넌트 위에 적을시 화면에 나타나기는 하나 화면 크기를 재조정해야 나타나는 오류가 있음

 

 

 

2022.05.17 - [전공/전공 마스터리] - 자바 프로그래밍 공부하면서 정리한 개념 및 구문, 메소드들 pt.2

 

자바 프로그래밍 공부하면서 정리한 개념 및 구문, 메소드들 pt.2

자바의 이벤트 처리 - 이벤트 객체 종류와 이벤트 소스 종류 이벤트 객체 이벤트 소스 ActionEvent JButton, JList, JMenuItem, JTextField ItemEvent : JCheckBox, JCheckBoxMenuItem, JList KeyEvent : Componen..

aapslie94.tistory.com