Java 7일차

소윤정·2021년 5월 29일
0

JAVA

목록 보기
6/15

오늘은 지금까지 배워왔던 수업 중에 가장 난이도 있는 수업이라 할 수 있겠다. 오버라이딩과 상속에 대해 배우면서 클래스를 왔다갔다 수업을 들으니까 너무 헷갈려서 다시 복습하면서 이제야 조금씩 이해가 가기 시작했다. 혹시 이글을 읽는 사람은 "그냥 이랬구나~" 하고 넘어가길 바란다.

배열과 객체의 차이점은?

  1. 객체 : 서로 다른 데이터 타입이 집합처럼 묶어있고 참조변수가 가르키고 있는 상태
    - 하나의 주제를 가지고 비슷한 녀석들을 묶은것

  2. 배열 : 자료가 저장되는 형태
    • 자료가 담기는 배열
    • 배열이 클래스 내부에 설계로 들어 갈 수 있고 클래스를 객체화시킨 걸 배열로 저장할 수 있다.

객체의 배열

클래스명[] 참조변수 = new 클래스명[요소의 개수];

Member[] members = new Member[3]; // 슬롯만 만들어놓은 것

참조변수[인덱스] = new 생성자();
members[0] = new Member();
members[1] = new Member();
members[2] = new Member(); // 매 해당인덱스마다 해줘야 한다.

연습문제

Student 클래스

public class Student {
    private int no; // 학생번호
    private String name;
    private int kor; // 국어점수
    private int math; // 수학점수
    private int eng; // 영어 점수

    public int getNo() {
        return no;
    }

    public int setNo(int no) {
        this.no = no;
        return no;
    }

    public String getName() {
        return name;
    }

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

    public int getKor() {
        return kor;
    }

    public void setKor(int kor) {
        this.kor = kor;
    }

    public int getMath() {
        return math;
    }

    public void setMath(int math) {
        this.math = math;
    }

    public int getEng() {
        return eng;
    }

    public void setEng(int eng) {
        this.eng = eng;
    }

    public void info(){
        System.out.println(no + ", " + name + ", " + kor + ", " + eng + ", " + math + ", " + getTotal() + ", " + getAvg());
    }

    public int getTotal(){ // 총점
        return kor + eng + math;
    }

    public double getAvg(){ // 평균
        return (kor + eng + math) / 3.0;
    }
}

Main 클래스

import java.util.Scanner;

/*
Student 클래스를 활용하여 아래와 같은 프로그램을 작성해보자.
결과)

몇 명의 학생을 등록할까요? 3
1번째 학생의 번호를 입력하세요 1
1번째 학생의 이름을 입력하세요 김사과
1번째 학생의 국어점수를 입력하세요 90
1번째 학생의 영어점수를 입력하세요 80
1번째 학생의 수학점수를 입력하세요 70

2번째 학생의 번호를 입력하세요 2

...

1, 김사과, 90, 80, 70, 총점, 평균
2, 반하나, 100,90,60, 총점, 평균
3, 오렌지, 70, 30,60, 총점, 평균
 */
public class Oop3 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.print("몇 명의 학생을 등록할까요? ");
        int n = sc.nextInt();

        Student[] students = new Student[n];

        for(int i = 0; i< n; i++){
            students[i] = new Student();
            System.out.print((i+1) + "번째 학생의 번호를 입력하세요 : ");
            int no = sc.nextInt();
            students[i].setNo(no);

            System.out.print((i+1) + "번째 학생의 이름를 입력하세요 : ");
            String name = sc.next();
            students[i].setName(name);

            System.out.print((i+1) + "번째 학생의 국어점수를 입력하세요 : ");
            int kor = sc.nextInt();
            students[i].setKor(kor);

            System.out.print((i+1) + "번째 학생의 영어점수를 입력하세요 : ");
            int eng = sc.nextInt();
            students[i].setEng(eng);

            System.out.print((i+1) + "번째 학생의 수학점수를 입력하세요 : ");
            int math = sc.nextInt();
            students[i].setMath(math);
        }

        for(Student st : students){
            st.info();
            System.out.println();
        }

    }
}

객체지향 프로그래밍(OOP)(용어 기억!!)

  1. 은닉화
    • 외부에서 접근하지 못하도록 은닉, 격리 시키는것
    • 변수 private 지정
    • setter, getter를 사용해 접근
  2. 추상화
    • 공통의 속성이나 기능을 묶어 이름을 붙이는 것
    • 클래스를 정의하는 것
  3. 캡슐화
    • 실제로 구현되는 부분을 외부에 드러나지 않도록 캡슐로 감싸 이용방법만 알려주는 것
    • 변수와 함수를 하나로 묶은 것
    • 객체가 맡은 역할을 수행하기 위한 하나의 목적을 한데 묶는것
  4. 상속성
    • 상위 개념의 특징을 하위 개념이 물려받는 것
    • 재사용으로 인해 코드가 줄어든다.
    • 객체지향 프로그래밍의 하이라이트라 할 수 있다.
  5. 다형성
    • 부모 클래스에서 물려받은 가상함수를 자식 클래스 내에서 오버라이딩 되어 사용하는 것
    • 클래스 내부에 동일한 이름의 오퍼레이션을 여러개 정의 하는 것

생성자(Constructor)

  • new 연산자를 통해 객체를 생성할 때 반드시 호출, 제일 먼저 실행되는 메소드
  • 클래스명과 동일한 이름을 가진 메소드
  • 필드를 초기화하는 역할
  • 반환 타입이 없다.
    - why? 생성자는 객체가 만들어질때 자동으로 호출시키는데 만약에 소스코드에 생성자가 없으면 빈 생성자 jvm이 그냥 빈생성자에 넣어 호출하기 때문
[public] 클래스 이름(매개변수1, 매개변수2..){
	생성자가 호출되면 실행할 문장;
	...
}

생성자 메소드 오버로딩

  • 메소드명이 같고, 시그니처가 다른 생성자 메소드를 여러개 만드는 것
// 방법 1)
Member(){
}

// 방법 2)
Member(int no){
}

// 방법 3)
public Member(int idx, String userid, String userpw, String name, String gender) {
}

// 방법 4) 
Member(String userid){
}

// 방법 5)
Member(double no){
}
→ 멤버변수의 타입만 다르면 얼마든지 같은 이름으로 만들 수 있다.

필드의 선언과 초기값

  1. byte : 0
  2. short : 0
  3. int : 0
  4. long : 0
  5. char : \u0000
  6. float : 0.0
  7. double : 0.0
  8. boolean : false
  9. String / 배열 / 클래스 / 인터페이스 : null

this 키워드와 this() 메소드

  1. this : 자기 클래스의 필드
this.gender= gender;
  1. this() : 자기 클래스의 생성자
  2. super() : 부모 클래스의 생성자

Object 클래스(⭐️⭐️⭐️⭐️) 무조건 기억!

  • 클래스를 선언할때 extends 키워드로 다른 클래스를 상속하지 않으면 암시적으로 java.lang.Object 클래스를 상속하게 된다.
  • 최상위 클래스이며 모든 클래스에게 상속하고 있다.
  • Object는 자바의 최상위 부모 클래스에 해당

상속

  • 특정 클래스를 구성할때 기존 클래스의 데이터와 메소드를 부모 클래스에서 그대로 물려받아 중복적인 코드를 줄이는 것과, 하나의 변수 타입으로 여러 종류의 객체를 의미하는 추상화된 방식의 프로그램 가능하게 하는 객체지향 기법
  • 상속을 하게 되면 자동으로 생기는게 아니라 따로 생성자를 만들어줘야 한다.

상속하는 방법

public class 클래스명 extends 부모클래스명{
	.. 클래스 설계
}

오버라이딩

  • 부모 클래스에 있는 필드 또는 메소드를 자식 클래스가 재정의 하는 것

instanceof 연산자

  • 참조 변수가 참조하고 있는 인스턴스(객체)의 실제 타입을 알아보기 위해 사용하는 연산자
  • instanceof 왼쪽에는 참조변수를 , 오른쪽에는 타입(클래스명)이 피연산자로 위치
  • 연산의 결과는 boolean 값으로 반환(true : 형 변환이 가능)

예제

class Animal{
    //동물 클래스
}

class Dog extends  Animal{
    // 강아지 클래스
}

public class Instanceof1 {
    public static void main(String[] args) {
        Animal animal = new Animal();
        Dog dog = new Dog();
        Animal ani_dog = new Dog();

        System.out.println("animal instanceof Animal : " + (animal instanceof Animal));
        System.out.println("animal instanceof Animal : " + (dog instanceof Dog));
        System.out.println("animal instanceof Animal : " + (animal instanceof Dog));
        System.out.println("animal instanceof Animal : " + (dog instanceof Animal));
        System.out.println("animal instanceof Animal : " + (ani_dog instanceof Animal)); // 형 변환 가능
        System.out.println("animal instanceof Animal : " + (ani_dog instanceof Dog)); // 형 변환 가능
    }
}

0개의 댓글

관련 채용 정보