C언어에 이어 JAVA 부분입니다.
클래스(Class)
객체 지향 관점에서 객체(Object)를 정의하는 틀로서 많은 객체 지향 프로그래밍 언어의 기본 구조로, 변수(Variable)와 메서드(Method)로 구성
public class Test {
public static void main(String[] args){
System.out.println("Hello"); // Hello
}
}
유형 | 설명 | 선언 형식 | 크기 |
---|---|---|---|
문자형(Character) | - 문자 하나를 저장 - 메모리에 저장은 숫자로 | char | 1 |
문자열형(String) | - 문자 여러 개를 저장 | String | |
정수형(Integer) | - 정숫값을 저장 | int | 4 |
부동 소수점 (Floating Point) | - 소수점을 포함하는 실숫값 저장 | float, double | |
논리형(Logical; Boolean) | - 변수의 참(true), 거짓(false)을 나타냄 | boolean |
① 클래스 변수(Class Variable)
public class Test {
int a = 5;
void fn(){
a = a + 3;
}
public static void main(String[] args){
Test s = new Test();
s.a = s.a + 5;
s.fn();
System.out.println(s.a); // 13
}
}
② 지역 변수(Local Variable)
public class Test {
public static void main(String[] args){
int a = 3;
System.out.println(a); // 3
}
}
③ static 변수
public class Test {
static int count = 0;
}
public static void main(String[] args){
Test s = new Test();
s.count++;
System.out.println(s.count); // 1
s.count++;
System.out.println(s.count); // 2
}
}
① 1차원 배열 선언
구분 | 선언 |
---|---|
초깃값이 없는 경우 | 자료형 []배열명 = new 자료형[배열_요소_개수]; 자료형 배열명[] = new 자료형[배열_요소_개수]; |
초깃값이 있는 경우 | 자료형 []배열명 = {초깃값}; |
public class Test {
public static void main(String[] args){
int []a = new int[3];
System.out.println(a.length); // 3
}
}
② 2차원 배열 선언
구분 | 선언 |
---|---|
초깃값이 없는 경우 | 자료형 [][]배열명 = new 자료형[행의 개수][열의 개수]; 자료형 배열명[][] = new 자료형[행의 개수][열의 개수]; |
초깃값이 있는 경우 | 자료형 [][]배열명 = {{초깃값}, {초깃값}, ··· }; |
public class Test {
public static void main(String[] args){
int[][] a = new int[3][2];
System.out.println(a.length); // 3
System.out.println(a[0].length); // 3
}
}
public class Test {
public static void main(String[] args){
int[][] a = {{1, 2}, {3}, {4, 5, 6}};
System.out.println(a.length); // 3
System.out.println(a[0].length); // 2
System.out.println(a[1].length); // 1
System.out.println(a[2].length); // 3
}
}
함수 | 설명 |
---|---|
System.out.print() | 개행을 하지 않는 출력함수 |
System.out.println() | 개행을 하는 출력함수 |
System.out.printf() | C 언어처럼 변수를 출력할 수 있는 출력 함수 |
System.in.readLine()
import java.io.BufferedReader; // BufferedReader 사용
import java.io.InputStreamReader; // InputStreamReader 사용
import java.io.IOException; // IOException 사용
public class Test {
public static void main(String[] args) throws IOException{ // 입력 시 예외처리
String a = null;
BufferedReader r = new BufferedReader(new InputStreamReader(System.in));
a = r.readLine(); // Hello
System.out.println(a); // Hello
}
}
for(제어변수 : 배열) {
문장;
}
public class Test {
public static void main(String[] args){
String[] name = {"MINSU", "DANBI", "YUJIN"};
for( String nm : name ){
System.out.println(nm); // MINSU\nDANBI\nYUJIN
}
}
① 사용자 정의 함수(User-Defined Function)
자료형 함수명(자료형 변수명, ···){
명령어;
return 반환값;
}
public class Test {
static char fn(int num){
if(num % 2 == 0)
return 'Y';
else
return 'N';
}
public static void main(String[] args){
char a = fn(5);
System.out.print(a); // N
}
}
인스턴스란 클래스로부터 만들어진 객체
class Test {
static void print(){
System.out.println("static method");
}
}
public class TestMain {
public static void main(String[] args){
Test.print(); // static method
}
}
→ ⭐ 자바는 클래스 이름과 파일 이름이 같아야 함. main 메서드가 포함된 클래스를 기준으로 하는데, 위 예제는 TestMain 클래스에 main 메서드가 포함되어 있으므로 TestMain.java 파일에 코드를 넣어서 실행해야 함
① 클래스 접근 제어자(Access Modifier)
② 클래스 접근 제어자 종류
종류 | 설명 |
---|---|
public | - 외부의 모든 클래스에서 접근이 가능한 접근 제어자 |
protected | - 같은 패키지 내부에 있는 클래스, 하위 클래스(상속받은 경우)에서 접근이 가능한 접근 제어자 - 자기 자신과 상속받은 하위 클래스 둘 다 접근이 가능한 접근 제어자 |
default | - 접근 제어자를 명시하지 않은 경우로 같은 패키지 내부에 있는 클래스에서 접근이 가능한 접근 제어자(java에만 존재) |
private | - 같은 클래스 내에서만 접근이 가능한 접근 제어자 |
private
접근 제어자를 사용하여 외부에서 접근하지 못하게 하며, 메서드는 외부에 공개할 것만 public
접근 제어자를, 그렇지 않으면 protected
나 private
접근 제어자를 사용하여 정보은닉을 함public class 클래스명{
private 자료형 변수명;
public 반환_자료형 메서드명(자료형 변수명, ···){
명령어;
return 반환값;
}
}
new
키워드로 생성해주어야 함클래스명 변수명 = new 클래스명(파라미터);
변수명.메서드명();
this.변수;
this.함수(매개변수);
class Test {
private int a;
public void setA(int a){
this.a = a;
}
public int getA(){
return a;
}
public static void main(String[] args){
Test tes = new Test();
tes.setA(5);
System.out.print(tes.getA()); // 5
}
}
public 클래스명(){}
이라는 아무 일도 하지 않는 생성자가 있는 것처럼 동작구분 | 코드 |
---|---|
생성자 정의 | public class 클래스명{ public 클래스명(매개변수){ 명령어; } } |
생성자 호출 | 클래스명 클래스변수 = new 클래스명(매개변수); |
구분 | 코드 |
---|---|
소멸자 정의 | public class 클래스명{ public void finalize(매개변수){ 명령어; } } |
생성자 호출 | 클래스변수.finalize(매개변수); |
class Test {
public Test(){
System.out.print("A");
}
public Test(int a){
System.out.print("B: "+a);
}
public void finalize(){
System.out.print("C");
}
public void fn(){
System.out.print("D");
}
public static void main(String[] args){
Test tes1 = new Test(); // A
Test tes2 = new Test(5); // B: 5
tes1.fn(); // D
tes1.finalize(); // C
}
}
class 부모_클래스명{ // 슈퍼 클래스
}
class 자식_클래스명 extends 부모_클래스명{ // 하위 클래스, 서브 클래스
}
class A {
public void fnA(){
System.out.print("A");
}
}
class B extends A{
public void fnB(){
System.out.print("B");
}
}
public class Test {
public static void main(String[] args){
B b = new B();
b.fnA(); // A
b.fnB(); // B
}
}
→ ⭐ 자바는 자식 클래스를 생성하면 부모 클래스 생성자를 먼저 방문하지만, 파이썬은 자식 클래스의 생성자만 방문
class A {
public void fn(){
System.out.println("A");
}
public void fn(int i){
System.out.println(i);
}
public void fn(double d){
System.out.println(d);
}
public int fn(int a, int b){
return a+b;
}
}
public class Test {
public static void main(String[] args){
A a = new A();
a.fn(); // A
a.fn(7); // 7
a.fn(10.0); // 10.0
System.out.print(a.fn(2, 3)); // 5
}
}
class 부모_클래스명{
public 반환_자료형 메서드명(자료형 변수명){ }
}
class 자식_클래스명 extends 부모_클래스명{
public 반환_자료형 메서드명(자료형 변수명){
// 부모 클래스의 메서드명, 매개변수가 동일해야 함
}
}
class A {
public void fn(){
System.out.println("A");
}
}
class B extends A {
public void fn(){
System.out.println("B");
}
}
public class Test {
public static void main(String[] args){
A a = new B(); // B의 생성자 B()와 A의 생성자 A()를 호출해야 하지만 둘 다 없으므로 아무 일 X
a.fn(); // B
}
}
→ A a = new B();
는 다형성(polymorphism)의 예로, 부모 클래스 A의 참조 변수가 자식 클래스 B의 인스턴스를 참조할 수 있음을 보여줌
class Parent {
public Parent(){
System.out.println("A");
}
public void fn(){
System.out.println("B");
}
}
class Child extends Parent {
public Child(){
System.out.println("C");
}
public void fn(){
System.out.println("D");
}
}
public class Test {
public static void main(String[] args){
Child c = new Child(); // A\nC\n
c.fn(); // D
}
super
키워드를 이용하여 상위 클래스의 변수나 메서드에 접근할 수 있음super.메서드명();
class A {
public void fn(){
System.out.println("A");
}
}
class B extends A {
public void fn(){
super.fn();
System.out.println("B");
}
}
public class Test {
public static void main(String[] args){
A a = new B();
a.fn(); // A\nB\n
}
}
abstract class 추상_클래스명 {
abstract 자료형 메서드명(); // 메서드 내부는 정의하지 않음
}
class 자식_클래스명 extends 추상_클래스명{
자료형 메서드명(){
명령어; // 메서드를 상속받아 메서드 내부를 정의
}
}
interface 인터페이스_클래스명 {
자료형 메서드명(); // 메서드 내부는 정의하지 않음
}
class 자식_클래스명 implements 인터페이스_클래스명{
자료형 메서드명(){
// interface의 메서드를 상속받아 내부를 정의
}
}
interface A{
void fn();
}
class B implements A {
public void fn(){
System.out.println("B");
}
}
class C implements A {
public void fn(){
System.out.println("C");
}
}
public class Test {
public static void main(String[] args){
A b = new B();
A c = new C();
b.fn(); // B
c.fn(); // C
}
}
① Thread 클래스 상속
Thread
클래스를 상속받고, run()
메서드에 스레드 동작 시 수행할 코드를 작성(run 메서드 오버라이딩)class T_Test extends Thread{
public void run(){
// 스레드 동작 시 수행할 코드
}
}
→ Thread 클래스의 run() 메서드를 상속받아 재정의
Thread 스레드변수 = new 상속받은스레드클래스();
Thread 스레드변수 = new Thread(new 상속받은스레드클래스());
스레드변수.start()
를 통해 스레드의 run()
메서드를 실행class T_Test extends Thread{
public void run(){
System.out.println("Run");
}
}
public class Test {
public static void main(String[] args){
Thread t1 = new T_Test();
Thread t2 = new Thread(new T_Test());
t1.start();
t2.start();
System.out.println("Main");
}
}
→ main 함수에서 t1.start();
이후, t2.start();
를 하면 main 함수와 t1 스레드, t2 스레드가 동시에 동작하게 되므로 출력 결과는 달라질 수 있음
② Runnable 인터페이스 상속
run()
메서드에 스레드 동작 시 수행할 코드를 작성(run 메서드 오버라이딩) class T_Test implements Runnable{
public void run(){
// 스레드 동작 시 수행할 코드
}
}
→ Runnable 클래스의 run() 메서드를 상속받아 재정의
Thread 스레드변수 = new Thread(new 상속받은스레드클래스());
스레드변수.start()
를 통해 스레드의 run()
메서드를 실행
출처 : [IT 기술 면접] Java의 Collection Framework 이란?
인터페이스 | 구현 클래스 | 특징 |
---|---|---|
List | LinkedList ArrayList | 중복이 가능하고, 순서가 있는 데이터의 집합 |
Set | HashSet TreeSet | 중복이 불가능하고, 순서가 없는 데이터의 집합 |
Map | Hashtable HashMap TreeMap | <키, 값>의 구조로 키는 중복이 불가능하고 값은 중복이 가능한 데이터의 집합 |
구문 | 내용 |
---|---|
try { 명령문; } catch ( 예외처리명 ) { 예외처리_명령문; } finally { 명령문; } | - try 다음에 수행할 명령문에서 예외가 발생하면 catch에서 예외를 처리 - catch는 하나 이상 작성하며, 상황에 맞는 예외처리가 수행됨 - finally 문장은 예외처리가 끝나고 받드시 실행되어야 하는 명령문을 수행함 |
public class Test {
public static void main(String[] args){
try {
int a = 4/0;
}
catch (Exception e) {
System.out.println(e.getMessage()); // /by zero(0으로 나눌 수 없어 예외 발생)
}
finally {
System.out.println("Finally");
}
}
}
public class Test {
public static void main(String[] args){
try {
throw new Exception();
}
catch (Exception e) {
System.out.println("강제 예외 발생");
}
}
}
접근제어자 자료형 메서드명(매개변수) throws 예외처리명{
명령문;
public class Test {
public void divide(int a, int b) throws Eception{
System.out.println(a/b);
}
public static void main(String[] args){
try {
a.divide(4, 0);
}
catch (Exception e) {
System.out.println(e.getMessage()); // /by zero
}
}
}