Alt + Insert : generatorShift + F6 : 이름바꾸기iter : for each문 단축키public class MyList{
public static void main(String[] args) {
MyList myList = new MyList();
}
}
🟢 자기 자신에서 자기 자신을 실행하는 것처럼 보임
🟢 보통 class를 2개 만들어서 한곳에서는 psvm, 다른 곳에서는 함수
(Main에서 함수의 클래스를 만든 후 함수 호출)
public interface NumberCreator {
// 인터페이스는 자식 클래스가 구현
// default를 하면 같은 패키지에서만 호출 가능
int numberCreator(int num);
}
🟢 int : 자식 클래스가 int를 리턴하기 위해 int 사용
🟢 int num : RandomNumberCreator에서는 범위 지정, SpecificNumberCreator에서는 리턴값 지정
public class RandomNumberCreator implements NumberCreator{
// 0~(num-1)까지의 숫자를 리턴
@Override
public int numberCreator(int num) {
return (int)(Math.random() * num);
}
}
🟢 0 ~ (num-1) 범위의 랜덤한 수 리턴
public class SpecificNumberCreator implements NumberCreator{
// 특정한 정수를 리턴
@Override
public int numberCreator(int num) {
return num;
}
}
🟢 num을 받아 그대로 리턴
public class RandomCalculator {
private int baseNum;
NumberCreator numCreator;
// numCreator에 RandomNumberCreator 또는 SpecificNumberCreator을 받아 넣기
// baseNum을 지정 안해줬을 경우 10으로 고정
public RandomCalculator(NumberCreator numCreator) {
this.numCreator = numCreator;
baseNum = numCreator.numberCreator(10);
}
// baseNum을 지정 해줬을 경우 num을 매개 변수로 전달
public RandomCalculator(NumberCreator numCreator, int baseNum) {
this.numCreator = numCreator;
this.baseNum = numCreator.numberCreator(baseNum);
}
public void plus(int a) {
System.out.println(a + " + " + baseNum + " = " + (a + baseNum));
}
public void minus(int a) {
System.out.println(a + " - " + baseNum + " = " + (a - baseNum));
}
public void multiple(int a) {
System.out.println(a + " * " + baseNum + " = " + (a * baseNum));
}
public void divide(int a) {
try {
double result = ((double) a / baseNum);
if(Double.isInfinite(result) || Double.isNaN(result)){
throw new ArithmeticException();
}
System.out.println(a + " * " + baseNum + " = " + result);
} catch (ArithmeticException e) {
System.out.println("랜덤하게 생성된 숫자가 0입니다.");
}
/*
이렇게 코드를 짜면 소수점이 안나옴
try {
System.out.println(a + " / " + baseNum + " = " + (a / baseNum));
} catch (Exception e) {
System.out.println("랜덤하게 생성된 숫자가 0입니다.");
}
*/
}
}
🔴 생성자의 매개변수를 1개, 2개 넣었을 경우 비교
🔴 나누기 부분 : (double)을 넣어주면 infinity가 나와서 예외처리 불가 ➡ 따라서 isInfinite, isNaN 사용
public class RandomCalculatorMain {
public static void main(String[] args) {
// NumberCreator 인터페이스 = RandomNumberCreator(다형성)
// 랜덤 숫자를 받아 생성자에 넣기
RandomCalculator rc = new RandomCalculator(new RandomNumberCreator());
rc.plus(10);
rc.minus(10);
rc.multiple(10);
rc.divide(10);
System.out.println();
// NumberCreator 인터페이스 = SpecificNumberCreator(다형성)
// 특정 숫자를 받아 생성자에 넣기
RandomCalculator sc = new RandomCalculator(new SpecificNumberCreator(), 30);
sc.plus(10);
sc.minus(10);
sc.multiple(10);
sc.divide(10);
System.out.println();
// 안넣었다면 10으로 baseNum 설정해놨음
RandomCalculator sc2 = new RandomCalculator(new SpecificNumberCreator());
sc2.plus(10);
sc2.minus(10);
sc2.multiple(10);
sc2.divide(10);
}
}
🟢 랜덤한 수 , 특정한 수, 생성자 매개변수 개수 다르게 실행
OOP(Object Oriented Programming)
Class = Object (모든것을 클래스 기반으로 만든다 - 객체 지향 <-> 함수형)
SOLID
- 클래스는 하나의 기능
- 개방폐쇄의 원칙(변화에 폐쇄, 확장은 개방)
- 서브타입은 언제나 기반 타입으로 교체할 수 있어야 한다
- 인터페이스 분리의 원칙(자신이 사용하지 않는 인터페이스는 구현X)
- 의존성역전의 원칙
DI(Dependency Injection)
di한다 - 생성자를 이용해 interface 구현체를 넘겨서 초기화시킨다
Pojo(Plain Old Java Object)
extends -> EJB
자바 코드로만 이루어진
IoC(Inversion Of Control)
DI와 비슷함
배열의 크기는 고정되어 있기 때문에 크기가 넘어가게 되면 다시 선언해줘야함.
➡ 단점 해결을 위해 List 사용
public class Student {
private int classNum;
private String name;
private String gitRepositoryAddress;
public Student(int classNum, String name, String gitRepositoryAddress) {
this.classNum = classNum;
this.name = name;
this.gitRepositoryAddress = gitRepositoryAddress;
}
public int getClassNum() {
return classNum;
}
public String getName() {
return name;
}
public String getGitRepositoryAddress() {
return gitRepositoryAddress;
}
}
🟢 생성자의 매개변수 3개를 이용하여 반번호, 이름, 깃허브주소 받기
🟢 getter함수를 사용하여 각 정보를 가져올 수 있도록 함
import java.util.ArrayList;
import java.util.List;
public class Names {
private List<String> students = new ArrayList<>();
private List<Student> studentObjs = new ArrayList<>();
public List<Student> getStudentObjs() {
this.studentObjs.add(new Student(1,"권하준","https://www.naver.com/"));
this.studentObjs.add(new Student(1,"조성윤","https://www.google.co.kr/"));
this.studentObjs.add(new Student(3,"안예은","https://www.naver.com/"));
this.studentObjs.add(new Student(1,"남우빈","https://www.google.co.kr/"));
this.studentObjs.add(new Student(2,"최경민","https://www.naver.com/"));
return studentObjs;
}
// 많은 Name이 있기 때문에 따로 클래스로 빼기
public List<String> names() {
this.students.add("권하준");
this.students.add("조성윤");
this.students.add("안예은");
this.students.add("남우빈");
this.students.add("최경민");
return this.students;
}
}
🟢 String 리스트 students를 만들어 이름 추가
🟢 Student 리스트 studentObjs를 만들어 학생 정보 추가
import java.util.ArrayList;
import java.util.List;
public class LikeLion2th {
// students 초기화
private List<String> students = new ArrayList<>();
private List<Student> studentObjs = new ArrayList<>();
// Names 클래스에서 이름을 가져와 students에 할당
public LikeLion2th() {
Names names = new Names();
this.students = names.names();
this.studentObjs = names.getStudentObjs();
}
// 멋사자 2기 학생의 이름이 들어있는 list를 return하는 method
public List<String> getStudentList(){
return this.students;
}
public List<Student> getStudentObjsList(){
return this.studentObjs;
}
}
🟢 LikeLion2th를 따로 만든 이유 : 많은 학생의 이름과 정보를 넣으면 코드가 길어질 수 있기 때문에 따로 클래스 생성
import java.util.List;
public class ListPracticeMain {
public static void main(String[] args) {
LikeLion2th likeLion2th = new LikeLion2th();
List<String> students = likeLion2th.getStudentList();
List<Student> studentObjs = likeLion2th.getStudentObjsList();
for (String student : students){
System.out.println(student);
}
System.out.println("\n이름 총 개수 : " + students.size());
System.out.println();
for (Student student : studentObjs){
System.out.println("반 : " + student.getClassNum());
System.out.println("이름 : " + student.getName());
System.out.println("깃주소 : " + student.getGitRepositoryAddress());
System.out.println();
}
}
}
🟢 이름은 String이기 때문에 바로 출력
🔴 정보는 Student 클래스이기 때문에 getter를 이용하여 값 가져오기