메모장

오답노트 01. 본문

JAVA/오답노트

오답노트 01.

Itchild 2024. 4. 8. 17:42
728x90
반응형

 

<객체 지향 프로그래밍의 특성 >

1.추상화

추상화란 예를 들어 , A클래스, B클래스, C클래스가 있다고 했을때 !

여기서 각 클래스 안에는 각자의 필드와 메서드가 있을것이지만

추상클래스는 A클래스, B클래스, C클래스들 간에 비슷한 필드와 메서드를 공통적으로 추출해 만들어진 클래스다.

 

'키보드'라는 클래스가 있다. '키보드'를 만드는 제조사는 여러개이다. A제조사, B제조사, C제조사는 각 제조사만의 스타일대로 키보드를 제작하고 소비자들에게 제품을 출시한다.

ex) A제조사는 키보드를 누를때 마다 불빛이 들어온다.

B제조사는 키보드를 누를때 딸깍 거리는 소리가 난다.

C제조사는 키보드를 누를때 살짝만 눌러도 잘 눌린다.

여기서 이 키보드들 간에 공통점은 무엇일까? 바로 키보드를 누른다! 라는 액션! 즉 메서드가 공통적이다. 그럼 이 메서드를 추출해서 추상클래스 안에 두면 된다. (키보드를 상속받아 탄생한, A키보드, B키보드, C키보드)

공통적인 변수를 추출 하여 추상클래스를 하나 선언한다. 실체 클래스는 실제 구체적인 클래스를 의미한다. 사람마다 다 다르지만 공통적인 부분은 추상클래스 , 실제적이고 구체적인 부분은 실체 클래스로 구분 하고 둘은 상속관계이다.

ex) 너는 웃지만 입을 가리고 웃고 , 나는 웃지만 덧니가 보이고 , 너는 웃지만 박장대소를 하고

웃는다는 공통점 ! 메서드가 공통된 부분 이 부분은 추상 클래스 , 구체적으로 입을 가리는지 덧니가 보이는지 박장대소를 하는지 ---> 실체 클래스

추상 클래스의 3줄 요약 (abstract)

1. 추상클래스는 실체클래스의 공통적인 부분(변수,메서드)를 추출해서 선언한 클래스

2. 추상클래스는 객체를 생성할 수 없다! 아직은 실체성이 없고 구체적이지 않기 때문에!

3. 추상클래스와 실체클래스는 어떤관계? 상속관계!

 

abstract class Pokemon{
    abstract void hello();
}
class Pika extends Pokemon{
@Override
    void hello() {
    }
}
class Kkobugi extends Pokemon{
@Override
     void hello() {
      }
} 
 

 

2.캡슐화

연관된 목적을 가지는 변수와 함수를 하나의 클래스로 묶어 외부에서 쉽게 접근하지 못하도록 은닉하는 것이다.

캡슐화는 중요한 데이터를 쉽게 바꾸지 못하도록 할 때 사용한다.

캡슐화를 하는 가장 큰 이유는 정보 은닉이다.

캡슐화를 통해 외부에서 내부의 정보에 접근하거나 변경할 수 없게 직접적인 접근을 막고

객체가 제공하는 필드와 메소드를 통해서만 접근이 가능하다.

이렇게 접근을 제한함으로써 유지보수, 확장 시 오류의 범위를 최소화, 데이터가 변경되어도 다른 객체에 영향을 주지 않아 독립성이 좋다.

캡슐화는 접근제어자를 통해 이루어진다.

* JAVA 의 접근 제어자

public : 접근 제한 없음

protected: 동일한 패키지 내에 존재하거나 파생 클래스에서만 접근 가능

default : 아무런 접근 제한자를 명시하지 않으면 default 값이 되며, 동일한 패키지 내에서만 접근 가능

private: 자기 자신의 클래스 내에서만 접근 가능

class Book{
private int num;
public int getNum() {
    return num;
   }
public void setNum(int num) {
    this.num = num;
   }
}  // getter , setter 메서드 사용
 

3.상속

class Person{
   String name;
}
class Student extends Person{
   }
public class TEST {
   public static void main(String[] args) {
    Student student=new Student();
    System.out.println(student.name);
  }
}
// 상속  : extends 를 사용하여 상속받고 자식 클래스의 객체가 부모클래스의 멤버변수에 접근할 수 있다.
 

4.다형성

class Shape{
String name;
double area;
void draw() {
  System.out.println("모양 그리기");
   }
}
class Circle extends Shape{
   @Override
   void draw() {
   System.out.println("원 그리기");
  }
}
class Rectangle extends Shape{
   @Override
   void draw() {
   System.out.println("네모 그리기");
  }
}
public class TEST {
public static void main(String[] args) {
   Shape[] datas=new Shape[3];
   datas[0]=new Shape();
   datas[1]=new Circle();
   datas[2]=new Rectangle();
   for(Shape v:datas) {
          v.draw();
       }
    }
} 
// 다형성의 대표적인 특징 : 오버 라이딩을 사용하여 자식 메서드의 결과값이 호출된다.
 

발견할 수 있는 에러 찾아보기

1 public static void main(String[] args) {
2             ArrayList datas=new ArrayList();
3             for(int i=1;i<=5;i++) {
4             datas.add(i); // [1,2,3,4,5]
5             }
6             int total=0;
7             for(int v:datas) {
8                   total+=v;
9             }
10            System.out.println("total: "+total); // total: 15
11            }
//이 문제에서 발견할수 있는 에러 : 7번 라인 forEach문을 사용할때 
//for(데이터타입 변수이름 : 배열변수이름)으로 작성해야 하는데 
//ArrayList 배열의 타입인 제네릭이 명식되어 있지 않다 .
//2번 라인에 제네릭을 작성 해줄것 ! <Integer> 정수타입 이므로 
//for(Integer v : datas )  <==> for(int v : datas) 서로 같은 식이다 
 

ArrayList 배열 과 예외 처리 이해하기

public static void main(String[] args) {
ArrayList<Integer> datas=new ArrayList<Integer>();;
                     datas.add(-5);
                     datas.add(-1);
                     datas.add(0);
                     datas.add(1);
                     datas.add(5);
                     System.out.println(datas);
                     for(int i=-1;i<5;i++) {
                      try {
                           System.out.println(10/datas.get(i));
                      } catch(Exception e) {
                          if(i<0) {
                                      System.out.println("HELLO");
                                   }
                                     else {
                                      System.out.println("JAVA");
                                       }
                                   }
                             }
                        }
 

ArrayList 배열 datas 에 숫자를 추가한다. { -5,-1, 0, 1, 5}

for문이 -1 부터 시작 하여 i < 5까지 돈다

디버깅 표 그려보기

 

i        i<5                10/datas.get(i)               i<0 이거나 i>=0

-------------------------------------------------------------------------------------------

-1      T                 10/datas.get(-1)                   T          HELLO      // i가 음수라서 trycatch문에 걸린다.

0       T                 10/datas.get(0) =>10/-5       F           trycatch문에 안들어가므로 결과값 -2

1       T                 10/datas.get(1)=>10/-1        F           trycatch문에 안들어가므로 결과값 -10

2       T                 10/datas.get(2)=>10/0         T           JAVA //0으로 나눌수 없어서 trycatch문에 걸린다.

3       T                 10/datas.get(3)=>10/1         F           trycatch문에 안들어가므로 결과값 10

4       T                 10/datas.get(3)=>10/1         F           trycatch문에 안들어가므로 결과값 2

 


생성자와 부모클래스 자식클래스 이해하기

class A{
A(){
      System.out.println("야옹");
}
  A(String msg){
     System.out.println(msg);
    }
 }
class B extends A{
B(){
     super("어흥");
   }
B(String msg){
      super(msg);
   }
  }
class C extends B{
C(){
    super("멍멍");
  }
   C(String msg){
        super("삐약");
     }
}
public class TEST {
      public static void main(String[] args) {
             C c=new C();
       }
}
 

C -> B -> A 순으로 상속을 받고 있다. C클래스는 c라는 객체를 만들어 생성자를 호출하고 있다.

C 는 부모생성자에서 받아온 String msg를 실행 시킨다.

 
사진 삭제

사진 설명을 입력하세요.

이렇게 쭉쭉쭉 올라가서 System.out.println();을 만남으로서 멍멍 출력 !

 

728x90
반응형

'JAVA > 오답노트' 카테고리의 다른 글

오답노트 02.  (0) 2024.04.09