2023-12-18 (8일차) - 생성자, ArrayList, 제네릭, 접근 제한자, 예외 처리

·2023년 12월 18일

📅 2023-12-18, 8일차

코드업 문제 1106 : int의 범위

"int 자료형의 범위를 알아내는 것이 이번 문제의 정답이다.
int는 정수형이고 32비트 자료형이다."

public class Main { 
    public static void main(String[] args) {
        
        int min, max;
        min = Integer.MIN_VALUE;
        max = Integer.MAX_VALUE;
        
    System.out.printf(min + " " + max);

	}
}

Integer.MIN_VALUE 와 Integer.MAX_VALUE

  • 처음엔 int 범위인 32비트를 계산해서 숫자로 계산해야하는 줄 알았는데
    구글링을 해보니 Integer.MIN_VALUEInteger.MAX_VALUE라는 것이 존재했음!
    자바에 기존에 있는 Integer 클래스에 있는 것이라고 한다.
    정확한 숫자를 기억할 필요 없이 최소 또는 최대 정수를 자동으로 알려준다.
  • Integer.MIN_VALUE와 Integer.MAX_VALUE를 각 변수에 넣어주고 값이 들어간 그 변수들을 출력해주기만 하면 된다.

생성자(constructor)

생성자 메서드: 객체생성과 동시에 변수를 원하는 값으로 세팅(초기화)해줌.

class 사람 { // 사람객체안에 이름과 나이를 넣을 공간을 만들거야
  String 이름;
  int 나이;

  //생성자 메서드명은 클래스명과 똑같이 적고 접근제어자 void등등 적지 않음
  // 실행되는 시점은 객체가 생성됨과 동시에 실행
  사람() {
    this.나이 = 22;
  }
}

  • 아래 예시처럼 생성자메서드안에 직접 매개변수를 넣고 인자값을 넣을 수 있다
public class Main {
  public static void main(String[] args) {

    사람 a사람1 = new 사람("김철수"); // 객체안에 인자값을 세팅

    System.out.printf("이름 : %s\n", a사람1.이름); // 김철수
    System.out.printf("나이 : %d\n", a사람1.나이); // 22
  }
}

class 사람 {
  String 이름;
  int 나이;

  사람(String 이름) { // 생성자안에 매개변수세팅
    this.이름 = 이름;
  }
}
/*
출력결과:
이름 : 김철수
나이 : 0
*/

// 김철수는 나이값이 0이다 왜냐하면 김철수가 들어가있는 생성자메서드에 나이 값이 없음.

static 변수

  • 전역변수에 세팅된다
  • 변수명 앞에 static이라고 붙인다
  • static 변수는 객체마다 들어가지 않는다
    • 공공재이다. 클래스 설계도에
  • 생성자와 다른점은, 생성자는 new(객체) 만들 당시 실행이되지만, static은 프로그램 시작하자마자 세팅
    • static변수는 객체 생성되기 전에 이미 값이 세팅되어있다는 뜻
static int lastId; // static 변수

static { // static 블럭
	lastId = 0;
}
  • static 블럭
    • 클래스가 로딩되고 클래스 변수가 준비된 후 자동으로 실행되는 블록
    • 한 클래스 안에 여러 개의 static 블록을 넣을 수 있다.
    • 용도 : 주로 클래스 변수를 초기화시키는 코드를 둔다.

G.C (garbage collection)

  • 자바에서는 유효하지 않은 메모리를 알아서 정리해준다
  • 대신 명시적으로 불필요한 데이터를 표현하기 위해서 일반적으로 null을 선언해준다.

Array List

  • 배열객체에는 limit이 정해졌다. 유한하다.
  • Array List는 limit가 정해지지 않았다. articles쓰는대로 공간이 생긴다.
ArrayList articles = new ArrayList();

ArrayLists클래스는 자바 library에 이미 존재함 -> import할 수 있음

제너릭 (generic)

Array List에 제약사항을 건다.

ArrayList <Array List>articles = new ArrayList<Array List>();

// <Array List> Array List만 들어갈 수 있음

ArrayList <Integer>articles = new ArrayList<Integer>();

// <Integer> 정수만 들어갈 수 있다는 뜻

// < > 요소의 타입을 지정해주는 공간이라고 생각하면 된다
List<Article> articles = new ArrayList<>(); // 생략버전

지금 나의 상태는?

내가 뭘 모르는가? 내가 뭐가 약한가?

  • 강사님의 설명을 들으면 문법적인 개념과 코드 풀이에 대해 이해가 되지만, 실제로 내가 써먹으려고 할때는 머리속에서 그동안 배우것들이 뒤죽박죽 되는 것 같다.
    예를 들자면, 메서드 기본꼴을 배우고 그것을 써오다가 생성자라는 것을 배우고 난 후라면 그때부터 나는 기본 메서드만 사용하기보다는 생성자 사용방법도 적절한 상황에서 할 줄 알아야하고 응용을 할 줄 알아야 한다. 그렇지만 어떤 상황에서 기본 메서드를 사용해야 하는지 어떤 상황에서 생성자를 사용해야하는지 빠른 판단이 안드는 것 같다. 효율적인 코드를 짤 판단력이 필요한 것 같기도하고, 그동안 배운 것들을 머리속에서 그때 그때 바로 끄집어 내서 사용 할 만큼의 숙련도 된 것 같지 않다.

접근제한자 종류

  • public : 모든 접근을 허용

  • protected : 같은 패키지(폴더)에 있는 객체와 상속관계의 객체들만 허용

  • default : 같은 패키지(폴더)에 있는 객체들만 허용

  • private : 현재 객체 내에서만 허용

  • 클래스에 필드들은 대부분 private -> 관례이다

class 사람 {
  private int id;

  public int getId() {
    return id;
  }

  public void setId(int id) {
    this.id = id;
  }
}
  • 게터 세터
  • source에 generate getter setter 클릭하면 자동으로 생성해준다
  • private int id에 접근을 할 수 없기에 게터랑 세터를 사용해서 돌아돌아서 접근할 수 있게끔 해준다.

예외처리 (다시 정리하기)

  • 예외(exception)는 오류를 발생시킬 수 있는 상황을 미리 예측하여 처리할 수 있다.

키워드

  • try : 예외(에러)가 예상 될 코드를 try로 감싼다
  • catch : 예외 종류에 해당하는 catch문에 가서 코드를 실행. 에러 발생하지 않으면 catch문은 실행되지 않는다.
  • finally : try 문장 수행 중 예외발생 여부에 상관없이 무조건 실행
  • throws : 메서드 선언문 오른쪽에 throws와 예외클래스를 명시한다. 이곳에서 예외를 처리하는 것이 아니라 자신을 호출한 메서드에게 예외를 전달하여 예외 처리를 떠넘기는 것
class 계산기 {

  static double 나누기(int a, int b) {
    int result;

    try { // 수행 할 문장 (안전하지 않은 코드)
      result = a / b;
    } catch (ArithmeticException e) { // 예외처리할 거
      System.out.println("이거 뭔가 잘못됐다"); // // 예외가 발생하여 이 문장이 수행된다
      result = 0;
    }  
    return result;
  }
}

팁!

try {
    result = a / b;

  } catch (ArithmeticException e) {
    System.err.println("이거 뭔가 잘못됐다 이거 못해 걍 0으로 처리할게" + e);
    System.exit(0);
    result = 0;
  }

  return result;
}

// System.out 대신 System.err사용하면 출력화면에 빨간색으로 표시 됨
// e라는 변수를 출력에 사용하면 뭐가 문젠지 알려줌
public class Main {
  public static void main(String[] args) {
    try {
      int rs = 계산기.나누기(10, 0);
      System.out.println(rs);
    }catch (ArithmeticException e) {
      System.err.println("0으로 못나눠");
    }catch (Exception e) {
      System.err.println("알 수 없는 에러");
    }
  }
}

class 계산기 {
  static int 나누기(int a, int b) throws ArithmeticException{
    int result;

      result = a / b;
      return result;
  }
}
  • 위 코드에서 ArithmeticException과 Exception의 차이는 뭐지?
    • ArithmeticException이 아니라면 Exception으로 가서 예외처리하고 실행

참고 할 사이트

👩‍💻 TO DO

  • 위키 수정, 코드예시 줄이고 키워드만 넣기
profile
hello world

0개의 댓글