[백앤드 6기] 2주차

roseb90·2024년 8월 20일

백앤드6기 기록

목록 보기
2/5

자바 기본과 객체지향프로그래밍 학습. OOP 너무 오랜만이라 감회가 새롭네~ IDE 사용법에 대한 의문/갈증이 해소 되고 있음. 역시, 반복하여 마구마구 써보는게 젤 좋음. 메가스터디 점심 크루가 생겨서 좋음 😄... 아침 등원 길이 너무 더워, 그늘이 있는 남부터미널역 3번 출구방향 이용하다가, 결국 버스탐. 담주는 좀 나아지려나~

이번 주는 뭘했나 ?
📂📝📌🖋✒🖋🖊🖌🖍🚅✈🚀🛸🛰🚩

Java 기본

출력

System.out.print();    
System.out.println();  
System.out.printf();

🚀 인텔리J 단축어: sout, soutf

입력

Scanner sc = new  Scanner(System.in);

- 문자: sc.next()
- 정수: sc.netxInt()
- 실수: sc.nextDouble()

조건 제어문

if else
if else if else
switch case 

반복 제어문

for() <-- 🚀 인텔리J 단축어: fori
foreach() <-- 🚀 인텔리J 단축어: iter
while()
do while()

⚡ begin, end, step을 먼저 정하고 코딩에 들어가자!

탈출문

break;

무한루프

for(;;)
while(true)

continue;
// for문에서 continue는 증감식이 발동함. 
// while문에서 continue는 조건식으로 흐름이 발동함.

자바 API 맛보기

Math.random() : 0.0~1.0 미만 사이의 임의 값 리턴

배열(Array)

String[] Array = {"aaa", "bbb", "ccc"}
System.out.println(Array.toString(Array));

// 이차원 배열
int[][] score = new int[4][3]; // 배열덩어리 4개, 덩어리 한 개에 배열 3개
System.out.println(Array.deepToString(score));

메서드

📁 메서드는 반복되는 코드 블록에 이름을 붙여놓은 것.

// 가변 파라미터 - 매개변수 작성
static double calcAverage(int... nums){
 ...
}
// 가변 파라미터 호출
double avg = calcAverage(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

// void 반환값이 없는 메서드
static void multiCalc(int n1, int n2){
  ...
}

// return type이 boolean일 경우 메서드 이름은 is로 시작, 예: isInclude()

🚀 인텔리J 메서드 이동: Ctrl+B, Ctrl+마우스좌클릭

인텔리J github 연동

인텔리J에서 github을 연동을 위해서 github에 SSO 로긴이 필요하다. 
인텔리J [메뉴 > Git > Share Project on Github]
github에 로그인 성공하면 JetBrain 웹페이지에 아래와 같이 나옴.

Java OOP(객체지향프로그래밍)

필드와 지역변수, 참조값과 문자열 equals()

필드와 지역 변수의 차이를 알아야 한다. 
어디(클래스 or 메서드)에 선언되느냐에 따라서 특징의 차이가 있다.

생성자

메서드와 유사함.
생성자 이름은 클래스 이름과 동일해야 한다.
리턴 타입이 없다.
생성자 호출은 new 생성자이름()
기본 생성자란 매개변수가 없는 생성자이다.
기본 생성자 없이 매개변수가 있는 생성자 하나를 만들었다면 매개변수 있는 생성자만 계속 호출이 된다.
생성자 오버로딩
 1. 생성자는 중복해서 여러 개 선언이 가능
 2. 단. 생성자의 매개변수 타입, 개수, 순서 중 하나가 달라야 중복(오버로딩)을 인정

예제코드: `package oop.constructor;`

패키지

패키지 선언은 코드 최상단에 위치해야함.
패키지는 비슷한 성격을 가진 자바 클래스나 인터페이스들을 모아 놓은 자바 폴더임.
패키지명은 소문자로.
패키지가 다르다면, import를 반드시 해주어야 한다. 
여기서 패키지가 다르다는 것은 폴더가 다르다는 의미임.

🚀 import를 강제하기 위한 인텔리J Setting
(add umambiguous imports on the fly? 체크v)

this

현재 객체를 참조하는 키워드로 자기 자신의 인스턴스 변수를 참조할 때 사용한다. 필드변수와 로컬변수를 구분하고자할 때 사용한다.
지금 생성되는 ‘그’ 객체, 지금 메서드를 호출한 ‘그’ 객체
필드 변수와 지역변수가 같으면 지역변수를 우선하기 때문에 필드 변수를 지정할 수 없다 이럴 때 this 키워드를 사용하여 구분이 가능하다.

🚀 인텔리J기능: 클래스 내부에서 alt+Ins 누르면 생성자 자동 입력 가능함.

생성자에서 this()로 생성자 호출시 this()는 맨 첫줄에 기입해야한다.

접근제한자(Access Modifier)

클래스에는 public과 default 제한자만 가능
클래스에 private 제한자와 protected는 사용이 불가능
접근 제한자를 안쓰면 default 제한임.
protected는 상속제한
상속관계가 맺어지면 protected로 지정된 필드, 메서드는 패키지가 달라도 제한적으로 사용할 수 있다. 
override도 가능함.

정보은닉과 캡슐화(Encapsulation)

클래스 내의 필드는 private로 접근을 제한하고, 클래스 내에 private 필드에 접근할 수 있는 메서드를 제공하여 필드 정보를 직접 터치할 수 없도록 한다. 이때 제공하는 메서드를 getter/setter 라고 한다.
getter와 setter의 네이밍 컨벤션은 set+필드이름, get+필드이름으로 한다.

🚀 getter/setter는 인텔리J가 자동으로 껍데기를 만들어 준다.(alt+Ins)

Encapsulation

📁 하나의 목적을 위해 관련 있는 코드를 모아두는 것.

// 시동 거는 기능
public void engineStart() {
    System.out.println("시동버튼을 눌렀습니다.");
    injectOil();
    injectGasoline();
    this.start = true;
    moveCylinder();
    System.out.println("시동이 걸렸습니다.");
}

상속(Inherit)

상속의 목적은 확장이다. extends 키워드 사용
Child() extends Parent

생성자는 상속되지 않는다. 
super를 이용해서 부모의 생성자를 호출해야 된다.
오버라이딩(Overiding) - 부모가 가지고 있는 기능을 다시 만들어 쓰는 것 

오버라이딩의 규칙 3
1. 부모가 물려주는 메서드와 이름이 똑같을 것
2. 부모가 물려주는 메서드와 리턴 타입이 똑같을 것
3. 부모가 물려주는 메서드와 매개변수의 선언 방식이 똑같을 것

@Override : 오버라이딩 규칙을 체크할 수 있게해주는 키워드: Annotation 이라 부름

접근 제한자는 more public 하게!! —> 부모의 접근 제한자 보다 More Public하게 코딩하자~

자바는 다중 상속을 지원하지 않는다.

사용제한자(static)

static은 필드(=변수)와 메서드에 붙일 수 있음.
모든 객체가 값을 공유함. 
static 변수는 주소 값으로 참조하지 않고, 클래스 이름으로 참조한다.
static 변수는 모든 클래스가 공유하는 전역변수임. 
static Method는 객체 생성 없이도 호출이 가능하다.

public static void main(String[] args) { 
   int result = Count.method2(); // 객체 생성 없이 method2 호출가능. 
                                 // 왜냐, static으로 선언되어 있기 때문.
   ...
}

사용제한자(final)

마지막(final) 필드 → 더 이상 값의 변경은 없다.
final은 마지막 값이라 무조건 초기화 해야함.
마지막(final) 메서드 → 더 이상 재 정의(overide)는 없다.
마지막(final) 클래스 → 더 이상의 개념의 확장 Extends(상속)은 없다.

상수(constant),대문자로 표시하는것이 관례임.

  static final double radius = 6400.0;

  static final double SURFACE_AREA;
  
  static {  // Static InitializerL 객체 생성되면 최초 1회만 로딩
    SURFACE_AREA = 4 * Math.PI * Math.pow(RADIUS, 2)
  }
  
상수는 import 선언을 static으로 선언하면 클래스명 생략하고 상수명만 사용이 가능하다.

🚀 인텔리J기능: al+enter → Add on-demand static import for “클래스명”
import static oop.ffinal.practice.WeatherConstants.*;

싱글톤 디자인 패턴

무분별한 객체 생성을 막기 위한 디자인 패턴
new가 아닌 getInstance()를 통해서 객체 참조 주소를 얻어온다.
생성자를 private로 선언하여 자기 자신안에서만 객체를 생성할 수 있게 한다.
  
  private Singleton(){
     ...
  }

자신 클래스 안에서 객체를 생성할때 private static로 선언하여, 
외부에서 객체를 바로 접근할 수 없도록 한다.
  
  private static Singleton s1 = new Singleton();

외부에서 클래스의 객체를 요구할 시, 미리 만들어 둔, 단 하나의 객체 주소값을 공개된 메서드를 통해 리턴한다.

  public static Singleton getInstance() { 
       ... 
       return s;
  }
  
데이터베이스 연동에 사용.

다형성(Polymorphism)

다(多)형(Type)성(성질) - 많은 객체 Type(기본형과는 관련없음)을 가질 수 있는 성격
다형성은 상속을 전제로 함.
다형성을 쓰는 목적은 타입의 규격화 이다.
부모 타입의 한 배열에 자식 타입을 모두 넣을 수 있다.  —> 코드가 간결해 질 수 있음.

Tip:
🚀 인텔리J 자동완성: iter  -> foreach 구문 자동 완성해줌.
🚀 인텔리J 자동완성: ifn  -> if (myComputer == null) { }

점점점(...) 가변 배열
public void blizzard(Player... targets)  

추상(abstract)메서드

추상 메서드는 body가 없다.
메서드가 추상(abstract)이면 클래스도 추상(abstract)이 되어야 한다.
abstract 키워드가 붙으면 오버라이딩이 강제된다.

  public abstract void eat();  

추상(abstract)클래스

추상 클래스는 상속이 메인이다.
상속은 extends
코드의 재사용성과 확장성이 목적

  public abstract class Pet() { ... }

인터페이스(interface)

인터페이스는 생성자를 가질 수 없다. 즉, 인터페이스 만으로 객체를 생성할 수 없다는 것이다.
인터페이스에서는 어떠한 값도 가질 수 없다.
인터페이스에서 변수를 선언하면 상수(static final)로 인식한다.
인터페이스는 implements
인터페이스는 클래스의 틀이다. 
인터페이스가 없으면 코드 생산성이 많이 떨어진다.
인터페이스는 추상 클래스보다 더 추상적이다.
인터페이스는 다형성과 유연성 제공이 목적
인터페이스 명에 i~ Prefix 대신 ~able postfix를 사용하는 추세임.
오버로딩은 메소드, 생성자만 해당, 오버라이딩은 상속만 해당.
다형성은 상속관계, 구현관계에서만 존재한다.

예외처리

예외는 컴파일예외, 런타임예외 두가지가 존재한다.
## 대표적인 실행(런타임) 예외의 종류
1. NullPointerException
   객체 참조가 없는 상태, 즉 null 값을 갖는 참조 변수로 객체 접근 
   연산자인 dot(.)를 사용했을 때 발생
2. ArrayIndexOutOfBoundsException
   배열에서 인덱스 범위를 초과하여 사용할 경우 발생.
3. NumberFormatException
   문자열로 되어 있는 데이터를 숫자로 변경하는 경우에 발생
4. ClassCastException
   형 변환은 부모 클래스와 자식 클래스간에 발생하고 구현 클래스와
   인터페이스 간에도 발생. 상속 또는 구현 관계가 아니라면
   다른 클래스로 타입을 변환할 수 없음.
🚀 인텔리J 제공 자동완성 기능 
단일 Catch

  try {
    ...
  } catch (Exception e) {
    ...
  }

다중 Catch
예외의 종류를 확실히 알고 있다면, 다중 Catch를 사용하요 예외 처리를 할수 있다.

  try{
    ...
  } catch (InputMismatchException e) { 
    ...
  } catch (ArithmeticException e) { 
    ...
  } catch (ArrayIndexOutOfBoundsException e) {
    ...
  } catch (NullPointerException e) { 
    ...
  } catch(Exception e){
    ...
  }catch 문에 exception을 or(|)로 묶어서 쓸 수 있다.
이거는 Java 7 부터 제공하는 문법

  catch (InputMismatchException | ArithmeticException e)
  
Finally
  try{...}catch{...}
  finally{
    ...
  }
close 같은 구문을 호출하는 용도로  사용되기도 함.   
예외 발생 여부와 상관없이 무조건 실행됨.

Throws 
예외를 발생시킨 메소드 호출부로 예외처리를 떠 넘긴다., 예외를 
발생시킨 곳에서 예외 처리하라는 의미.

  static void greet(int idx) throws Exception { }
  
Throw
강제로 예외를 만들 수 있다.

  if (!account.equals(this.account)) {
    throw new InvalidLoginInputException("아이디가 불일치");

2주차 마치며

얕은 지식들이 좀 더 명확해 지고 있는 듯하고, 툴에도 조금은 익숙해지고 있는 것 같다. 일단 닥치는 대로 코드를 타이핑 하자~~~

0개의 댓글