local Repository(내 컴퓨터) 와 remote Repository(GitHub) 연결
1.
인텔리제이로 자바 프로젝트 만들기.
2.
화면 상단바, VCS에서 Create Git Repository 선택 후 OK.
3.
java 파일 생성 한 뒤, “ctrl + K” 누르고, 커밋 메세지 작성 후 커밋하기 ( github에 push할 파일만 선택할 것)
4.
화면 우측 하단의 master branch 누르고 new branch 를 main으로 추가.
5.
github의 Repository에서 새로운 repository 만들고 주소 복사
6.
인텔리제이 상단바, Git에서 Manage Remotes누르고 “+”로 복사한 주소를 추가.
7.
push하기
Static과 Class
•
하나의 클래스 안에서 메인 메소드와 일반 메소드를 동시에 선언할 경우, 일반 메소드에는 static 키워드를 사용해야 함.
//메인 메소드는 기본적으로 static 메소드이고,
//static 메소드 내부에선 인스턴스 멤버의 직접 사용이 불가능함.
public class UserDao {
public static void plus(int first, int second) {
System.out.println(first + second);
}
public static void main(String[] args) {
plus(1, 2);
}
}
//일반 메소드에 static 을 사용하지 않는 경우,
//메인 메소드에 객체 생성하는 과정을 거치면 사용이 가능해짐.
public class UserDao {
public void plus(int first, int second) {
System.out.println(first + second);
}
public static void main(String[] args) {
UserDao dao = new UserDao();
dao.plus(1, 2);
}
}
Java
복사
•
하나의 클래스 모든 코드를 넣지 않고 여러 클래스로 분리 작성 하는 이유 : 객체 지향 언어의 가장 큰 특징, 다형성 활용을 위함.
Java의 원칙과 특징.
1.
SOLID : OOP(객체 지향 프로그래밍)의 다섯 원칙
•
SRP (Single Responsibility Principle) : 단일 책임 원칙
하나의 클래스는 하나의 역할(책임)만을 가지도록 클래스를 분리 작성한다.
•
OCP (Open Closed Principle) : 개방 폐쇄 원칙
확장에는 열려있고(다형성 활용) 변경에는 닫혀있어야 한다.
•
LSP (Listov Substitution Principle) : 리스코프 치환 원칙
인터페이스 혹은 상속을 통해 클래스가 자유롭게 업(다운)캐스팅 되어야 한다.
•
ISP (Interface Segregation Principle ) : 인터페이스 분리 원칙
하나의 클래스가 지닌 여러 역할(책임)을 가질 경우. 각 인터페이스는 따로 분리 작성해야한다.
•
DIP (Dependency Inversion Principle) : 의존 역전 원칙
변하기 쉬운(교체가 빈번한) 요소는 반드시 추상화된 인터페이스 혹은 상위 클래스로 작성해야한다.
2.
DI (Dependency Injection) : 의존성 주입
•
외부에서 의존성 객체를 주입하는 것
ex ) 한 클래스의 생성자 매개변수로 인터페이스 구현체( 의존성 객체)를 사용함.
3.
POJO (Plain Old Java Object) : 오래된 방식의 간단한 자바 오브젝트
•
자바가 지닌 객체 지향적 설계의 장점을 포기하고 특정 기술과 환경에 종속 되어서는 안 됨.
인터페이스를 활용한 객체 지향적 코딩 실습.
•
목표
◦
두 정수 a, b를 입력받아 서로 더하고, 연산 과정과 결과값을 짝수 홀수 판별함
◦
판별 결과를 문자열(한글, 영어)로 출력
•
설계
◦
문자열 출력 메소드를 인터페이스를 통해 추상화한 뒤, “한글 출력”과 “영어 출력” 클래스로 각각 구체화 해서 다형성을 활용.
•
과정
// 1. 문자열 출력 메소드를 인터페이스에 선언.
public interface Word {
public String getWord(int a);
}
Java
복사
// 2. 위의 인터페이스를 상속해 서로 다른 두 클래스 구현.
// 2-1. 한글 출력 클래스
public class EvenOrOddK implements Word{
@Override
public String getWord(int a) {
if(a % 2 == 0) {
return "짝수";
} else {
return "홀수";
}
}
}
// 2-2. 영어 출력 클래스
public class EvenOrOddE implements Word{
@Override
public String getWord(int a) {
if(a % 2 == 0) {
return "Even";
} else {
return "Odd";
}
}
}
Java
복사
// 3. 위의 두 클래스를 사용해, Main 클래스(메소드)에서 사용할 클래스 작성.
public class Judge {
private Word word;
// 생성자의 매개변수로 인터페이스 사용.
// -> 즉, 2. 에서 작성한 두 클래스 모두 매개변수에 대입 가능.
public Judge(Word word) {
this.word = word;
}
// 2. 에서 작성한 메소드를 사용해 결과값 도출 메소드 작성.
public void result(int a, int b) {
System.out.println( word.getWord(a)+" + "+ word.getWord(b)+" = "+word.getWord(a+b));
}
}
Java
복사
// 4. 실제 프로그램이 실행 될 Main 클래스 작성과 실행
public class Main {
public static void main(String[] args) {
// 한글 출력 클래스의 객체 대입
Judge judge = new Judge(new EvenOrOddK());
judge.result(5,6);
// 영어 출력 클래스의 객체 대입
judge = new Judge(new EvenOrOddE());
judge.result(5,6);
}
}
Java
복사
// 출력 결과
홀수 + 짝수 = 홀수
Odd + Even = Odd
Java
복사
List<> 활용 예제
•
목표
◦
반 번호, 이름, 개인 홈페이지 주소를 저장하는 Student 클래스로 List를 만들고 그 내용을 출력하기.
•
과정
// 1. 정보를 담을 Student 클래스 만들기.
public class Student {
// 필요한 정보를 변수로 선언
private int classNo;
private String name;
private String gitRepositoryAdrress;
// 생성자를 통한 정보 입력
public Student(int classNo, String name, String gitRepositoryAdrress) {
this.classNo = classNo;
this.name = name;
this.gitRepositoryAdrress = gitRepositoryAdrress;
}
// 결과 출력 시, 문자열 리턴을 위한 toString() 오버라이딩.
@Override
public String toString() {
return classNo+" "+name+" "+gitRepositoryAdrress;
}
}
Java
복사
// 2. Student 클래스를 활용한 List 만들기
// List 사용을 위한 import.
import java.util.ArrayList;
import java.util.List;
public class MakeList {
// List 객체 생성.
// Generic을 사용하여, List에는 Student 객체만 들어갈 수 있음.
private List<Student> studentObjs = new ArrayList<>();
// List의 .add()메소드를 활용한 정보 입력 메소드
// Student 클래스에서 작성한 생성자로, 객체 생성과 동시에 List에 정보 입력
public List<Student> getStudentObjs() {
this.studentObjs.add(new Student(1,"권하준","https://github.com/dongyeon-0822/java-project-exercise"));
this.studentObjs.add(new Student(1,"조성윤","https://github.com/kang-subin/Java"));
this.studentObjs.add(new Student(3,"안예은","https://github.com/KoKwanwun/LikeLion.git"));
this.studentObjs.add(new Student(1,"남우빈","https://github.com/lcomment/Algorithm_Solution--Java/tree/main/LikeLion"));
this.studentObjs.add(new Student(2,"최경민","https://github.com/cmkxak/likelion-java-course"));
// 선언한 리턴타입(List<Student>)에 맞춰 스스로를 리턴
return this.studentObjs;
}
Java
복사
// 3. 2. 에서 만든 클래스를 사용해, Main 클래스에서 사용할 클래스 작성.
import java.util.ArrayList;
import java.util.List;
public class PrintList {
// 2. 에서 만든 메소드를 사용하기 위해 객체 생성
MakeList makeList = new MakeList();
// 출력을 위한 빈 List 객체 생성
private List<Student> studentObjs = new ArrayList<>();
// 생성자를 통해서 빈 List에 정보 입력
public PrintList() {
studentObjs = makeList.getStudentObjs();
}
// List 호출 메소드
public List<Student> getStudentList() {
return this.studentObjs;
}
}
Java
복사
// 4. Main 메소드에서 프로그램 실행
import java.util.List;
public class Main {
public static void main(String[] args) {
// 3. 에서 만든 메소드 활용을 위해 객체 생성.
// 객체 생성과 동시에 3.의 생성자 메소드에 작성한 대로 정보도 입력됨.
PrintList printList = new PrintList();
// 빈 List 객체에 정보를 호출함.
List<Student> studentObjs = printList.getStudentList();
// for문과 .get() 메소드를 통해 List에 입력된 정보를 한 줄씩 출력.
for(int i = 0 ; i < studentObjs.size() ; i ++) {
System.out.println(studentObjs.get(i));
}
}
}
Java
복사
// 출력 결과
1 권하준 https://github.com/dongyeon-0822/java-project-exercise
1 조성윤 https://github.com/kang-subin/Java
3 안예은 https://github.com/KoKwanwun/LikeLion.git
1 남우빈 https://github.com/lcomment/Algorithm_Solution--Java/tree/main/LikeLion
2 최경민 https://github.com/cmkxak/likelion-java-course
Java
복사