① 플랫폼 독립성
: Java 언어 --> 바이트코드로 컴파일 후, JVM(자바 가상 머신)이 설치된 환경이라면 어디서든 실행 가능
② 객체 지향
: 객체 지향적 언어 (모듈, 클래스, 메소드 etc.)
③ 거대한 생태계
: 전세계적으로 활성화된 개발 커뮤니티
for(배열의요소 : 배열) {
명령문;
}
예시)
int[] array = {10, 20, 30, 40};
for(int a : array) {
System.out.println("배열 요소 순회: " + a);
}
: 현실에 존재하는 사물. ex) TV, 냉장고, 사진기
: 객체를 만들기 위한 설계도. 클래스를 따라 만들어진 객체들은 서로 독립적이다.
① 필드(속성)
: 객체가 가지는 고유 데이터. 클래스가 가지는 변수. ex) 사람의 나이, 자동차의 브랜드
② 메소드
: 객체의 기능(동작). ex) 사람 - 걷기/뛰기, 비행기 - 이륙하기/착륙하기
③ 생성자
: 생성자를 통해 클래스를 객체화(실체화). 객체를 만들 때 특정 값을 넣어주기도 함.
Student student1 = new Student("James", 18);
: 표준 설계도. 모든 클래스가 가져야 할 기본적인 내용들을 담는다.
인터페이스로는 객체를 생성할 수 없으며, 클래스로 구현이(implements) 필요하다.
① 캡슐화
: 서로 연관있는 속성과 기능을 객체로 묶어 외부로부터 보호함. Java에서는 접근 제어자를 통해 달성 가능하다.
② 다형성
: 객체의 메소드가 여러가지 형태를 가질 수 있음
class Animal {
void makeSound() {
System.out.println("소리 내기");
}
}
class Dog extends Animal {
@Override
void makeSound() {
System.out.println("멍멍");
}
}
class Calculator {
int add(int a, int b) { // 기본형
return a + b;
}
double add(double a, double b) { // 매개변수 타입 다름
return a + b;
}
int add(int a, int b, int c) { // 매개변수 개수 다름
return a + b + c;
}
}
③ 상속
: 기존에 구현한 클래스(부모 클래스)를 재활용하여 사용 가능.
--> 코드의 재사용성이 높아짐.
④ 추상화
: 클래스의 핵심 공통 요소만 추출하여 상위 클래스(or 인터페이스)로 만드는 것.
--> 계층적 구조 특징을 통해 유지보수성이 좋은 프로그래밍 가능
Java에서는 추상 클래스, 인터페이스를 통해 달성 가능하다.
git branch <브랜치이름> : 복사본, 새로운 분기점 생성.
git merge <병합할 브랜치 이름> : 다른 브랜치와 현재의 브랜치를 병합(합치기)
예시) dev 브랜치와 feat 브랜치를 merge 하는 경우
git branch // 현재 브랜치 확인, feat 브랜치라고 가정
git checkout dev // feat 브랜치 --> dev 브랜치로 이동
git merge feat // 현재 브랜치(dev)에 feat 브랜치의 내용을 병합
Git merge 보다는 원격에서 PR(Pull Request)를 통해 병합
예시) 새로운 기능 개발
1. 기능 브랜치 생성 및 코드 작성
2. Git add, commit, pull, push
3. Pull Request 생성 및 코드 리뷰
Github에서 Pull Request를 생성하여 요청하면, 팀장(owner)나 팀원들이 코드 리뷰를 통해 요청을 승인하거나 변경 요청을 하여 충돌 없이 원격 저장소에 병합되도록 함.
만약 충돌 발생 시, 가능한 로컬에서 해결한 뒤 다시 Pull Request를 요청하는 것이 좋음.
Github에는 다양한 Pull Request 관련 옵션 (일정 이상 승인 시 PR 승인, 특정 인원만 승인 가능), 원격 브랜치 보호 옵션이 있으므로 활용하면 좋음.
그외 : 팀 프로젝트 시작 시 팀장은 간단한 코드와 함께 프로젝트를 생성하여 github에 올린 뒤, main이 아닌 dev 브랜치를 디폴트 브랜치로 설정하여 브랜치를 분리하는 것이 좋음.