정보처리기사

[정보처리기사] Java 정리

hminor 2023. 7. 13. 19:11

간단 용어 및 문법 정리

Java 정리

  • 객체 생성
    • C p = new C() 로 객체를 생성 후
    • C q 와 같이 빈 객체를 만들기만 하고 new를 해서 객체를 생성하지 않은 상태로
    • q = p 를 수행하게 된다면
      • p 안에 있던 기존 값들을 깊은 복사로 완전한 복사를 하는것이 아니라
      • 같은 주소값을 가지게 하는 것으로 임의의 주소값 100번지를 서로 똑같이 가지게 된다는 의미를 가진다.
  • this
    • ex) set(int a) {this.a = a} 의 경우에 this를 사용한 이유는
      • 파라미터 값과 기존 a와 구분하기 위함
  • 생성자
    • 클래스명과 클래스 내의 클래스와 같은 이름의 메서드가 있다면 생성자가 된다.
    • ex) Class Ref{ int a Ref(int x) {a = x} }
  • 접근 지정자
    • Private: 클래스 내부만
    • Protected: 클래스, 패키지(폴더), 상속의 경우만
    • Public: 어디에서든 가능
    • default: 패키지 내부에서만 가능
  • 접근 지정자 문법 오류
    • private
      • Person 클래스의 name은 private 접근 지정자로 지정되어있는데
      • main 함수에서
        • Person으로 만든 객체 p 가 있는데
        • p.name = ‘치치’ 라고 하게 되면 private 접근 지정자로 지정한 name이기에 문법 오류가 발생하게 된다.
        • 그래서 public으로 접근 가능한 setName과 같은 메서드를 통해 해당 private 인 name을 변경할 수 있다.
  • toString()
    • Java의 최상단 객체 내부에 toString() 이라는 메서드가 있는데
    • 문제에서 toString() 이 나왔다고 하면 해당 메서드를 오버라이딩하는것이라고 볼 수 있다고 한다.
  • 문법
    • class CS extends C{} 라고 하면
      • CS가 C를 상속 받은 것이 된다.
    • class CI extends C implements I {} 라고 하면
      • CI는 C를 상속 받고 I로부터 구현한다 라고 볼 수 있다.
  • 생성자
    • 아버지가 날 나은 형태의 클래스의 경우
      • 무조건 아버지부터 실행을 하게 된다.
      • 그리고 명시적으로 호출을 하게 하는 super() 메서드가 있다.
      • super() 가 없다면 묵시적으로 부모 클래스와 같은 이름의 메서드를 가진 default 생성자를 호출하게 된다.
    • 또한 this() 를 하게 되면 본인의 default 생성자를 호출하게 된다.
  • 오버로딩
    • a.cal(24.8,5.1) 의 경우 아래와 같이 여러개의 오버로딩 상황의 경우엔 일단 소수의 경우엔 double을 사용한다고 한다.
    • public float cal(float a, float b) {return a-b}
    • public double cal(double a, double b) {return a+b}
  • 하이딩 개념
    • class B extends A 를 통해 B는 A를 상속받는 상황이고 A,B 둘 다 static void f() 라고 하는 똑같은 메서드를 가지고 있을 때
    • A a = new B() 를 통해 객체를 생성하고
    • a.f() 를 했을 경우 현재 객체를 생성 시 A(아버지)로부터 B(자식)을 생성했기에 또 static 한 메서드를 실행 시킬 경우엔 오버라이딩이 아닌 하이딩 개념이라고 한다.
    • 그래서 객체를 생성 시켰을 때 생성 시킨 쪽의 static 한 메서드를 사용해야해서 위의 경우엔 A가 가지고 있는 f() 메서드를 사용하게 된다.
    • 그리고
      • B만 가지고 있는 c() 메서드가 있을 경우 현재 a.c() 를 호출하게 되면 오류가 발생한다고 한다.
      • 이유는 A로부터 생성을 했는데 A는 해당 c() 라고하는 메서드를 가지고 있지 않기 때문!
  • 오버라이딩
    • 위의 하이딩의 코드에서 이제 A와 B 모두 void g() 메서드가 있을 경우
    • a.g() 라고 호출을 했을 때는 해당 g() 메서드의 경우엔 static이 아니기에 오버라이딩으로 B가 재정의한 g() 메서드를 호출하게 된다.
  • 추상클래스
    • 추상클래스는 객체를 생성할 수 없다.
    • ex) 추상 클래스인 Shape 이 있을 경우
    • Shape s
    • s = new Shape() ← 와 같이 작성하게 되면 오류가 발생하게 된다.
  • 지역변수
    • public static void main() 안에서 생성된
      • int a = 3 의 경우엔 다른 함수에서는 사용하지 못하는 지역변수가 된다.
  • 예외처리
    • try 구문에서 실행 되다가 에러가 발생하게 되면
      • catch 문으로 넘어가게 되고
      • catch 문을 모두 수행하고 나면 다시 try 구문으로 돌아오는 것이 아니라
      • finally 문으로 이동하게 된다.
      • 즉, finally 는 무조건 수행해야한다.
        • 없다면 수행하지 않는다.
    • throw new Exception()
      • 해당 구문을 수행하게 되면 해당 구문 내의 catch 문으로 이동하게 된다.
    • throw ??
      • catch 구문 내에서 throw 가 한번 더 있다고 하면 해당 메서드를 호출한 곳에서 예외처리를 추가로 더 해달라는 의미가 된다.
        • 물론 해당 구문 내의 finally까지 처리하고 넘어가야 한다.
    • equals vs ==
      • 같은 요소를 가진 v1, v2가 각자 따로 생성되어 있어서 서로 다른 주소값을 가지고 있는 상황
      • v1.equals(v2) 라고 할 경우
        • v1과 v2는 서로 같은 하위 내용을 가지고 있는지 물어보는 것이어서
        • 결과는 true
      • v1 == v2 라고 할 경우
        • 서로 다른 주소값을 가지고 있는 것이어서
        • 결과는 false가 된다.
    • removeLast()
      • python 의 pop() 과 유사함
    • 정적 변수
      • Student 라고 하는 하나의 클래스를 가지고 4개의 객체를 생성했을 때
        • 생성자로 static 한 변수 cnt를 1씩 증가시키는 문제인데
        • 생성된 객체로는 m1, m2, m3, m4 이렇게 4개가 있고 생성자로 인해 cnt ++ 를 총 4번 해서 static한 cnt는 현재 4가 되는데
          • 나는 생성 될 때의 cnt 값을 각각의 객체에 부여해서
          • m1은 cnt = 1, m2는 cnt = 2 … m4는 cnt = 4 이렇게 되는 줄 알았는데
          • static 변수는 계속 같은 값을 가지게 되어서 m1, m2, m3, m4 모두 같은 cnt 값인 4를 가지게 된다
      • 또한 static한 변수를 밖에서 사용하고자 할 경우
        • 클래스명.static 변수명 을 작성하면 된다
        • 그래서 Student.cnt를 하게 되면 4를 가져올 수 있게 된다.
    • 문법
      • 앞의 출력문이 문자열이면 뒤에 나오는 출력문 또한 문자로 출력을 하게 된다.
      • ex) 3+4+”a”+3+4 의 경우
        • 앞의 3+4는 숫자이기에 7로 되고 이후에 a부터는 문자로 취급해서
        • 결과는 7a34로 출력하게 된다.
    • 문법2
      • 객체를 생성하지 않은 상태에서 메서드를 사용하려고 한다면 static을 붙여줘야 한다.
        • ex) System.out.print(check(1))
        • (ㄱ) String check(int num){}
          • 현재 객체를 생성하지 않고 메서드를 실행하려고 하기 때문에
          • (ㄱ)에는 static을 추가해줘야 한다.
    • substring(x,y)
      • substring의 첫 번째 인자는 해당 위치 인덱스부터
      • 두 번째 인자 전까지 출력하라는 의미가 된다.
      • 즉, [x:y] 슬라이싱 하라는 의미가 된다.
    • indexOf(x)
      • indexOf는 () 안의 값인 x 의 첫 번째 인덱스를 조회하는 메서드가 된다.
    • Integer.toString()
      • integer 를 string 형태로 저장하겠다는 의미가 됨.