자바 프로그래밍 기초
- 자바 환경변수 설정
내PC(속성) -> 고급 시스템 설정 -> 고급 -> 환경변수
JAVA_HOME : 자바 설치 경로
PATH : 자바 설치 경로/bin
- 온라인 자바 API 참조 링크
http://docs.oracle.com./javase/8/docs/api
- 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
'전공 > 전공 마스터리' 카테고리의 다른 글
이클립스 자바 - System.out.print() 자동완성 만들기 / sysp (0) | 2022.03.31 |
---|---|
이클립스 자바 - AWT, Swing 관련 API들이 자동완성이 되지 않을 때 (2) | 2022.03.31 |
칼리 리눅스 한글화 하기 (0) | 2021.06.06 |
칼리 리눅스 vm tools 설치하기 (0) | 2021.06.06 |
우분투 리눅스 vm tools 설치하기 (0) | 2021.06.06 |