1. 반복문, 조건문

  • 반복문 기본 문법: for, while, do-while 문을 이해하고, 반복 조건의 평가 순서를 숙지.
    • while 루프:
      • 조건을 먼저 평가하고 조건이 true일 경우 루프 실행.
      • 조건이 false이면 루프를 한 번도 실행하지 않을 수 있음.
      • int count = 0;

        while (count < 5) {
            System.out.println("Count is: " + count);
            count++;
        }
    • do-while 루프:
      • 조건을 나중에 평가하므로, 루프 본문이 최소 1번 실행됨.
      • int count = 0;

        do {
            System.out.println("Count is: " + count);
            count++;
        } while (count < 5);
        • Count is: 0 //출력 값들   
          Count is: 1  
          Count is: 2  
          Count is: 3  
          Count is: 4  
  • 중첩 루프: 외부 루프와 내부 루프의 상호작용 및 변수 스코프.
  • 확장 for 문: 배열이나 컬렉션을 순회할 때 자주 사용.
  • public class LoopExample {
        public static void main(String[] args) {
            for (int i = 0; i < 3; i++) {
                for (int j = 0; j < 2; j++) {
                    System.out.println("i: " + i + ", j: " + j);
                }
            }
        }
    }
  • 조건문 기본 문법: if-else, switch-case의 조건식의 결과와 흐름
  • public class IfElseExample {
        public static void main(String[] args) {
            int num = 5;
            if (num > 0) {
                System.out.println("Positive");
            } else {
                System.out.println("Non-positive");
            }
        }
    }
  • public class SwitchExample {
        public static void main(String[] args) {
            int day = 3;
            switch (day) {
                case 1:
                    System.out.println("Monday");
                    break;
                case 2:
                    System.out.println("Tuesday");
                    break;
                default:
                    System.out.println("Other day");
            }
        }
    }

2. 산술 연산자

  • 우선순위: +, -, *, /, % 등 연산자의 우선순위를 이해.
  • 증감 연산자: 전치(++x)와 후치(x++)의 동작 차이.
  • 복합 대입 연산자: +=, -=, *=, /=, %= 등.
  • public class ArithmeticExample {
        public static void main(String[] args) {
            int a = 5;
            int result = ++a + a--;
            System.out.println("Result: " + result); // 12
        }
    }

3. 생성자(Constructor)

  • 기본 생성자와 사용자 정의 생성자: 생성자가 없는 경우 디폴트 생성자가 자동 추가됨. 반대로 생성자를 정의 하면 디폴트 생성자는 자동적으로 추가되지 않는다!
  • 1. 컨스트럭터 명과 클래스명과 동일해야한다
    2. 인스턴스 생성시에만 쓸 수 있다
    3. 반환값의 형을 기술할 수 없다
    4. private수식이 가능하다
  • this()와 super(): 다른 생성자 호출 및 상위 클래스 생성자 호출.
  • 오버로딩: 파라미터의 수나 타입이 다른 생성자 정의 가능.
  • class Person {
        String name;

        Person() {
            this("Unknown");
        }

        Person(String name) {
            this.name = name;
        }
    }

    public class ConstructorExample {
        public static void main(String[] args) {
            Person p1 = new Person();
            Person p2 = new Person("John");
            System.out.println(p1.name); // Unknown
            System.out.println(p2.name); // John
        }
    }

4. 계승과 다형성

  • 상속의 기본 원칙:
    • 단일 상속만 지원.
    • 생성자와 private한 필드와 메서드는 계승안된다
    • 하나의 클래스로부터 복수의 서브클래스를 정의하는 것은 가능
    • super.메서드명, super.필드명 으로 슈퍼클래스의 인스턴스 메서드나 필드에 접근가능
    • is-a 관계를 명확히 이해.
      • is-a관계가 아닐경우, 컴파일 에러가 발생하기 때문에 클래스맵을 그려보는게 좋다
      •  
        계승
  • 다형성:
    • 슈퍼클래스 타입으로 서브클래스 객체 참조.
    • 오버라이드된 메서드가 서브클래스에서 실행.
    • class Animal {
          void sound() {
              System.out.println("Animal makes a sound");
          }
      }

      class Dog extends Animal {
          @Override
          void sound() {
              System.out.println("Dog barks");
          }
      }

      public class PolymorphismExample {
          public static void main(String[] args) {
              Animal a = new Dog();
              a.sound(); // Dog barks
          }
      }

5. 오버라이드와 오버로드

  • 오버라이드:
    • 메서드 시그니처(이름, 파라미터리스트)와 반환 타입은 슈퍼클래스와 동일하거나 서브클래스여야 한다.
    • 접근 제어자는 슈퍼클래스보다 더 넓거나 같아야 함.
    • 오버라이드 (Override)조건:
      • 메서드 이름, 매개변수의 타입과 개수, 리턴 타입이 완전히 동일해야 합니다.
      • 접근 제어자는 부모 메서드보다 더 넓거나 같아야 합니다.
        • 예: 부모가 protected면 자식은 protected 또는 public 가능.
      • 부모 메서드가 throws로 선언한 예외보다 같거나 적은 범위의 예외만 던질 수 있습니다.
      • 메서드가 static 또는 final로 선언된 경우에는 오버라이드할 수 없습니다.
  • 오버로드:
    • 같은 이름의 메서드가 다른 파라미터 리스트를 가짐.
    • 오버로드 (Overload)조건:
      • 메서드 이름이 동일해야 합니다.
      • 매개변수의 타입, 개수, 순서 중 하나 이상이 달라야 합니다.
      • 리턴 타입은 상관없으며, 오직 매개변수의 차이로 구분됩니다.
      • 접근 제어자나 예외 처리는 영향을 미치지 않습니다.
       

6. 접근제어자

  • private, default, protected, public:
    • 클래스, 패키지, 상속, 외부 접근 수준 결정.
    • public
      • 제한 없음.
      • 모든 클래스, 패키지, 외부에서 접근 가능.
    • protected
      • 동일 패키지 + 다른 패키지의 하위 클래스에서 접근 가능.
      • 상속 관계에서 주로 사용.
    • (default)
      • 동일 패키지 내에서만 접근 가능.
      • 접근 제어자를 명시하지 않을 때 적용.
    • private
      • 동일 클래스 내에서만 접근 가능.
      • 가장 제한적, 외부 접근 불가.
      • 생성자도 메서드의 한 종류이기때문에 접근제어자 사용이 가능하다 (클래스내의 생성자, 필드, 클래스의구상메서드에 사용 가능)
        • 서브클래스의 super도 불가능하다!!
        • 같은 클래스 라면 this.프라이빗메서드명 도 호출 가능 
  • class Example {
        private int value = 10;

        private void showValue() {
            System.out.println("Value: " + value);
        }

        public void accessPrivate() {
            showValue();
        }
    }

    public class AccessModifierExample {
        public static void main(String[] args) {
            Example ex = new Example();
            ex.accessPrivate(); // Value: 10
        }
    }
  • 캡슐화
    • 필드는 private, 접근은 public 메서드 사용  
    • class Student {
          private String name;

          public String getName() {
              return name;
          }

          public void setName(String name) {
              this.name = name;
          }
      }

      public class EncapsulationExample {
          public static void main(String[] args) {
              Student student = new Student();
              student.setName("Alice");
              System.out.println(student.getName()); // Alice
          }
      }

7. static 필드 및 메서드

  • 특징:
    • 클래스 단위에서 공유.
    • 객체 생성 없이 사용 가능.
    • static 메서드에서는 인스턴스 멤버 접근 불가.
      • static 필드나 static 메서드에 접근 가능하다 (인스턴스 필드, 메서드에는 접근 불가)

8. 배열

  • 초기화: 배열 선언 및 초기화 방식.
  • 참조값: 배열의 참조값 변경 가능.
  • 데이터 형의 뒤에 []를 써줘야함
  • public class ArrayExample {
        public static void main(String[] args) {
            int[] numbers = {1, 2, 3};
            int[] otherNumbers = numbers;
            otherNumbers[0] = 10;

            System.out.println(numbers[0]); // 10
        }
    }

9. 인터페이스

  • 정의:
    • 정보은닉을 위해 쓰인다.
    • 필드와 메서드는 모두 public이어야 한다 
    • public static final 필드와 public abstract 메서드로만 구성. (암묵적)
      • 인터페이스의 필드는 상수로 선언된.
        따라서 값을 초기화하지 않으면 컴파일 에러가 발생.
      • public interface Example {
            String hi = "Hello";  // 가능 (public static final 자동 추가)
            int value;            // 컴파일 에러 (초기화 필요)
        }
    • default와 static 메서드도 포함 가능(Java 8 이후).
    • interface Animal {
          void sound();
      }

      class Cat implements Animal {
          public void sound() {
              System.out.println("Cat meows");
          }
      }

      public class InterfaceExample {
          public static void main(String[] args) {
              Animal animal = new Cat();
              animal.sound(); // Cat meows
          }
      }
  • 구현:
    • 클래스는 여러 인터페이스를 구현 가능.

10. 패키지 및 import

  • 패키지:
    • 소스 파일의 첫 줄에 선언.
  • import:
    • *는 패키지 내 모든 클래스를 포함하나, 하위 패키지는 포함하지 않음.
    • 임포트 선언은 임포트하고 싶은 클래스의 완전수식클래스명을 지정하던가 그 클래스가 소속하는 패키지명과 와일드카드 표기로 패키지 내 전부를 임포트하는 식으로도 지정할 수 있다

11. null 및 기본 값

  • 참조형 변수: 초기화되지 않으면 null.
  • 기본값:
    • 정수: 0, 실수: 0.0, 논리: false, 참조형: null.

12. 추상 클래스

  • 추상 클래스는 인스턴스화할 수 없으며 추상 메서드를 포함
  • 명시적으로 abstract를 적어주어야 컴파일에러가 발생하지 않는다
  • abstract class Shape {
        abstract void draw();
    }

    class Circle extends Shape {
        void draw() {
            System.out.println("Drawing Circle");
        }
    }

    public class AbstractClassExample {
        public static void main(String[] args) {
            Shape shape = new Circle();
            shape.draw(); // Drawing Circle
        }
    }

13. 기타

  • 자바의 특징:
    • 플랫폼 독립성, 가비지 컬렉션, 멀티스레드 지원.
      • 1. 플랫폼에 의존하지 않는다
        2. 아키텍쳐에 의존하지 않는다
        3. 자동으로 메모리가 해방된다
        4. 실행시에 컴파일하면서 실행하는 실행시컴파일러 방식을 채용한다
        5. 멀티스레드에의한 병행처리를 서포트한다
        6. 보안성능이 높다
        7. Write Once, Run Anywhere가 표어임
    • java SE에는 GUI를 실현하는 AWT나 Swing, JavaFx라이브러리를 포함한다. 따라서 구이 베이스의 어플리케이션을 개발하려면 JavaSE가 맞다. Java EE는 웹베이스의 어플리케이션을 개발하는 기능을 제공한다.Java ME는 휴대전화나 PDA,공업용로봇어플리케이션 개발, Java DB는 JDK에 부속하는 간이 데이터베이스 관리소프트웨어이다.
 

 

 


주의할 점 및 시험 대비

  1. 자주 틀린 항목 보강:
    • 반복문과 중첩 루프: 변수 초기화 및 스코프 처리.
    • 접근제어자와 캡슐화: private의 정확한 사용법.
    • 생성자와 초기화 블록: this()와 super()의 위치 및 사용.
  2. 출제 빈도가 높은 영역:
    • 기본 문법: 반복문, 조건문, 연산자.
    • 객체지향: 상속, 다형성, 인터페이스.
    • 기타: static과 기본 생성자.
  3. 문제 풀이 시 체크리스트:
    • 메서드와 생성자의 서명 확인.
    • 상속 관계도 작성.
    • static과 인스턴스 멤버의 접근 가능 여부.

+ Recent posts