자바 Day 6

Hyunsu·2023년 3월 27일
0

Today I Learned

목록 보기
6/37
post-thumbnail

📝 목차

  1. 익명 클래스
  2. 주요 개념 정리
  3. 종합 실습 문제

1. 익명 클래스

익명 클래스를 활용해서 UI 처리를 하는 문제를 풀어보았다.

// InputBox 클래스
public class InputBox {
	public static final int KEY_DOWN = 2;
	public static final int KEY_UP = 4;
	KeyEventListener listener;
	
	public InputBox() {}
	
	public void setKeyListener(KeyEventListener listener) {
		this.listener = listener;
	}

	public void listenerCalled(int eventType) {
		if(eventType == KEY_DOWN) {
			listener.onKeyDown();
		} else if(eventType == KEY_UP) {
			listener.onKeyUp();
		}
	}
}

// KeyEventListener 인터페이스
public interface KeyEventListener {
	public void onKeyDown();
	public void onKeyUp();
}

// MyPage 클래스
public class MyPage {
	public static InputBox input;
	
	public static void main(String[] args) {
		MyPage my = new MyPage();
		my.setUI();
		my.pressKey();
	}
	
	public void setUI() {
		input = new InputBox();
		KeyEventListener listener = new KeyEventListener() {
			
			@Override
			public void onKeyUp() {
				System.out.println("Key Down");
				
			}
			
			@Override
			public void onKeyDown() {
				System.out.println("Key Up");
				
			}
		};
		
		input.setKeyListener(listener);
	}
	
	public void pressKey() {
		input.listenerCalled(InputBox.KEY_DOWN);
		input.listenerCalled(InputBox.KEY_UP);
	}
}

2. 주요 개념 정리

클래스 Class

상태와 행위를 갖는 자바의 기본 단위이다.

캡슐화 Encapsulation

연관된 상태와 행위를 결정하는 기능을 묶어 주는 것이다.

메시지 Message

메서드에서 다른 메서드를 호출할 때 전달하는 값으로 매개변수를 메시지라고도 한다.

객체 Object

클래스는 사물의 단위를 의미하고 객체는 각 사물을 의미한다.

상속

부모에 선언된 변수와 메서드에 대한 사용권을 갖는 것이다.

다형성

부모 클래스에서 파생된 자식 클래스들의 기능이 각기 다를 수 있다.

오버라이딩 Overriding

부모 클래스에 선언되어 있는 메서드와 동일한 선언을 갖지만 구현이 다른 것을 의미한다.

오버로딩 Overloading

메서드의 이름은 동일하지만 매개 변수들을 다르게 하는 것을 의미한다.

자료형

📌 기본 자료형

  • 정수형 : byte short int long char
  • 소수형 : float double
  • 기타 : boolean

📌 참조 자료형

일반적으로 new 와 생성자를 지정해 객체를 생성한다.
String 은 특수한 참조 자료형으로 new 를 이용해 객체를 생성할 필요가 없고 + 연산이 가능한 유일한 클래스다.

변수 종류

  • 지역 변수
  • 매개 변수
  • 인스턴스 변수
  • 클래스 변수

예외 처리

try {
	// 예외가 발생 가능한 문장
} catch(예외 e) {
	// 예외가 발생했을 때 처리 문장
} finally {
	// 무조건 실행되는 문장
}

String 클래스 주요 메서드

  • getBytes() : 문자열을 byte 배열로 변경

  • length() : 문자열의 길이 리턴

  • isEmpty() : 문자열이 비어있는지 확인

  • equals() : 두 문자열의 값이 같은지 확인

  • startsWith()endsWith() : 매개변수로 넘어온 문자열로 시작 또는 끝나는지 확인

  • contains() : 매개변수로 넘어온 문자열이 포함되어 있는지 확인

  • indexOf()lastIndexOf() : 매개변수로 넘어온 문자열이 있는 위치를 반환

  • substring()subsequence() : 문자열의 특정 범위 값을 잘라서 리턴

  • split() : String 배열로 리턴

  • concat() : 기본 문자열 뒤에 매개 변수로 넘어온 문자열을 합침

  • trim() : 문자열 맨 앞과 뒤에 있는 공백 제거

  • replace() : 문자열의 특정 위치 내용을 매개변수로 넘어온 값으로 변경

  • format() : 정해진 포맷으로 변환


3. 종합 실습 문제

지금까지 배운 내용을 바탕으로 직원들의 연봉 인상율을 계산하는 문제를 풀어보았다.
어떻게 하면 코드를 좀 더 간략하게 작성할 수 있을지에 대해서도 고민해면서 문제를 풀어보았다.

특히 객체지향 문제는 많이 생각해보고 풀어봐야하는 것 같다. 알고있다고 생각했던 것도 막상 코드로 작성하려고 하면 잘 생각이나지 않는다거나 에러가 발생하는 것 같다.

앞으로 더 많이 생각하고 코드도 두드려보면서 성장! 하고싶다 🛠️

Employee 클래스

public class Employee {
	private String name; // 이름
	private int type; // 업무 역할
	private long salary; // 연봉
	
	// 생성자
	public Employee(String name, int type, long salary) {
		this.name = name;
		this.type = type;
		this.salary = salary;
	}
	
	// setter
	public void setName(String name) {
		this.name = name;
	}
	
	public void setType(int type) {
		this.type = type;
	}
	
	public void setSalary(long salary) {
		this.salary = salary;
	}
	
	// getter
	public String getName() {
		return name;
	}
	
	public int getType() {
		return type;
	}
	
	public long getSalary() {
		return salary;
	}
}

CalculateSalary 클래스

public class CalculateSalary {
	public static void main(String[] args) {
		CalculateSalary calc = new CalculateSalary();
		calc.calculateSalaries();
	}
	
	public long getSalaryIncrease(Employee employee) {
    
		long increase = 0;
		
		switch(employee.getType()) {
		case 1 :
			increase = (long)(employee.getSalary() + (employee.getSalary() * -0.95));
			employee.setSalary(increase);
			break;
			
		case 2 :
			increase = (long)(employee.getSalary() + (employee.getSalary() * 0.1));
			employee.setSalary(increase);
			break;
			
		case 3 :
			increase = (long)(employee.getSalary() + (employee.getSalary() * 0.2));
			employee.setSalary(increase);
			break;
		
		case 4 :
			increase = (long)(employee.getSalary() + (employee.getSalary() * 0.3));
			employee.setSalary(increase);
			break;
			
		case 5 :
			increase = (long)(employee.getSalary() + (employee.getSalary() * 1));
			employee.setSalary(increase);
			break;
		}
		
		return increase;
        
	}
	
	public void calculateSalaries() {
    
		Employee[] employee = new Employee[5];
		
		employee[0] = new Employee("LeeDaeRi", 1, 1000000000);
		employee[1] = new Employee("KimManager", 2, 100000000);
		employee[2] = new Employee("WhangDesign", 3, 70000000);
		employee[3] = new Employee("ParkArchi", 4, 80000000);
		employee[4] = new Employee("LeeDevelop", 5, 60000000);
		
		for (int i=0; i<employee.length; i++) {
			System.out.println(employee[i].getName() + "=" + getSalaryIncrease(employee[i]));
		}

		Employee[] employee = { new Employee("LeeDaeRi", 1, 1000000000),
								new Employee("KimManager", 2, 100000000),
								new Employee("WhangDesign", 3, 70000000),
								new Employee("ParkArchi", 4, 80000000),
								new Employee("LeeDevelop", 5, 60000000)
							  };
		
		for (Employee e : employee) {
			System.out.println(e.getName() + "=" + getSalaryIncrease(e));
		}
        
	}
	
}

Reference

profile
현수의 개발 저장소

0개의 댓글