본문 바로가기

기록/자바_국비

[배운 내용 정리] 1113 자바 국비교육

728x90

2020년 11월 13일 9시 ~ 15시 30분 zoom으로 수업 진행

 


 

객체 지향 언어

 현실세계에서의 사물이나 개념처럼 독립되고 구분되는 각각의 객체로 이루어져 발생한 사건들을

 객체 간의 상호작용이라 하는데 이 개념을 컴퓨터로 옮겨 놓은 것을 객체지향 언어라고 한다.

 

객체(Object)

 클래스에 정의된 내용대로 new 연산자를 통해 메모리 영역에 생성된 것

 

클래스

 객체의 특성에 대한 정의를 한 것, 캡슐화를 통해 기능을 포함한 개념

 사물이나 개념의 공통요소를 추상화(abstraction) 하여 정의

 

추상화

 유연성을 확보하기 위해 구체적인 것은 제거한다는 의미

 프로그램에서 필요한 공통점을 추출하고, 불필요한 공통점을 제거하는 과정

 

객체지향 언어에서의 "객체"

 현실에 존재하는 독립적이면서 하나로 취급되는 사물이나 개념

 객체지향 언어에서 객체의 개념은 클래스에 정의된 내용대로 메모리에 할당된 결과물(Object)

 

객체(Instance)의 할당

 new 연산자와 생성자를 사용하여 객체 생성 시 heap 메모리 공간에 서로 다른 자료형의 데이터가 연속으로 나열/ 할당 된 객체 공간을 의미

ex) Student s = new Student();

 

객체지향의 3대 특징

캡슐화(Encapsulation), 상속(Inheritance), 다형성(Polymorphism)

 

캡슐화(Encapsulation)

 추상화를 통해 정리된 데이터들과 기능을 하나로 묶어 관리하는 기법

 클래스의 가장 중요한 목적인 데이터의 접근 제한을 원칙으로 하여

 클래스 외부에서 데이터의 직접 접근을 막고, 대신 데이터를 처리하는 함수들을 클래스 내부에 작성하는 방법

 

캡슐화 원칙

1.     클래스의 멤버 변수에 대한 접근 권한은 private을 원칙으로 한다.

2.     클래스의 멤버 변수에 대한 연산처리를 목적으로 하는 함수들을 클래스 내부에 작성

3.     멤버 함수는 클래스 밖에서 접근할 수 있도록 public으로 설정한다

 

클래스(Class) 선언

[접근제한자] [예약어] class 클래스명 {

     [접근제한자] [예약어] 자료형 변수명;

     [접근제한자] [예약어] 자료형 변수명;  à 속성값 설정

 

     [접근제한자] 생성자명() {    }

 

     [접근제한자] 반환형 메소드명(매개변수) {

       //기능정의, 설정

     }

}

 

클래스 예시

 

클래스 접근 제한자

구분

같은 패키지 내

전체

+

public

O

O

-

(default)

O

 

ex)

public class 클래스명 {

    //

}

 

class 클래스명  {

    //

}

 

소스파일 구성 순서

 package문, import문, 클래스 선언

  

소스파일 구성 예시

package com.test01;      //package문

 

import java.util.Scanner;  //import문

 

public class ImportTest{   //클래스 선언

    public static void main(String[] args) {

         Scanner sc = new Scanner(System.in);

    }

}

 

 

패키지(package)

 서로 관련된 클래스 혹은 인터페이스의 묶음으로 패키지는 폴더와 비슷

 패키지는 서브 패키지를 가질 수 있으며 ‘.’ 으로 구분한다.

 

패키지의 선언

 소스파일 첫 번째 문장에 단 한번 선언

 하나의 소스파일에 둘 이상의 클래스가 포함된 경우, 모두 같은 패키지에 속함

 모든 클래스는 하나의 패키지에 속하며, 패키지가 선언되자 않은 클래스는 자동적으로

 이름없는 패키지(default)에 속하게 됨

 

import

 사용할 클래스가 속한 패키지를 지정하는데 사용

 import 문을 사용하면 클래스를 사용할 때 패키지명 생략 가능

 java.lang 패키지의 클래스는 import 하지 않고도 사용 가능

 

import문의 선언

 import문은 패키지문과 클래스 선언 사이에 선언하며 컴파일시 처리되므로

 프로그램 성능에 영향을 주지 않음.

 지정된 패키지에 포함된 클래스는 import 가능하지만, 서브패키지에 속한 모든 클래스까지는 불가능

 

import문 주의사항

 이름이 같은 클래스가 속한 패키지를 import 할 때는 클래스 앞에 패키지 명을 붙여 구분해 주어야 한다.

 

필드(Field)

 - 필드 표현식

[접근제한자] [예약어] class 클래스명 {

    [접근제한자] [예약어] 자료형 변수명 [= 초기값];

}

 

 

- 필드 접근제한자

메소드의 접근제한자와 동일하다

구분

해당 클래스 내부

같은 패키지 내부

후손 클래스 내부

전체

+

public

O

O

O

O

#

protected

O

O

O

 

~

(default)

O

O

 

 

-

private

O

 

 

 

 

- 필드 예약어 static

 같은 타입의 여러 객체가 공유할 목적의 필드에 사용하며,

 프로그램 시작시에 정적 메모리에 자동으로 할당되는 멤버에 적용하는 예약어이다.

 

- 필드 예약어 final

 하나의 값만 계속 저장해야 하는 변수에 사용하는 예약어. 값 변경 불가능

 

package com.test.chap03.test01;

 

//변수 선언 위치에 따른 구분

public class FieldTest02 {//클래스 영역의 시작

            

             public static int staticNum;

            

             public static final int STATIC_INT = 1;

             public final static int STATIC_INT2 = 2; //final이랑 static 순서 바껴도 됨

             //상수필드 = > 반드시 선언과 동시에 초기화

             //static? 상수?는 반드시 다른 곳에서도 접근 할 수 있게 해야함

            

             public void test() {

                           //지역변수에서는 static 키워드를 이용한 변수 선언 불가능

                           //static int localStaticNum;

             }

            

}

 

- 클래스 초기화 블록

 인스턴스 블럭 : {}

    인스턴스 변수를 초기화 시키는 블록으로 객체 생성시마다 초기화한다

 

 static(클래스) 블럭 : static{}

    static 필드를 초기화 시키는 블록으로 프로그램 시작 시에 한 번만 초기화 한다.

static{ 필드1 = 초기값; }

 

{ 필드2 = 초기값; }

 

 

 

 

package com.test.chap03.test01;

 

//변수 선언 위치에 따른 구분

public class FieldTest01 {//클래스 영역의 시작

            

             //클래스 영역에 작성하는 변수 => 필드

             //필드 == 멤버변수 == 전역변수

             private int globalNum;

             private static int staticNum;

            

             //인스턴스 초기화 블럭

             {globalNum = 10;} //생성자 ?사용? 인스턴스 생성 될때마다! 실행되는 구문

             static {staticNum = 10;} //프로그램이 메모리에 올라갈때 실행

            

             public void test(int num) {//메소드 영역의 시작

                           //메소드 영역에서 작성하는 변수 => 지역변수

                           //메소드 괄호 안에 선언하는 변수 => 매개변수

                          

                           int localNum;

                           System.out.println(num);//매개변수는 호출 시 값이 넘어와서 변경되기 때문에 초기화 필요 없음

                          

                           //지역변수는 사용하기 위해서 초기화가 꼭 필요하다

                           //System.out.println(localNum);

                          

                           //전역변수라서 해당 메소드에서도 사용 가능

                           System.out.println(globalNum);

                          

             }

            

             public void test2() {

                           //System.out.println(localNum); //지역 변수는 해당 지역(블럭)에서만 사용 가능

                           System.out.println(globalNum);

             }

            

            

}//클래스 영역의 끝

 

필드 초기화 순서

 - 클래스 변수

 JVM 기본값 -> 명시적 초기값 -> 클래스 초기화 블록 초기값

 

 - 인스턴스 변수

     JVM 기본값 -> 명시적 초기값 -> 인스턴스 초기화 블록 초기값 -> 생성자를 통한 초기값

 

package com.test01.chap01;

 

public class ScoreMain {

 

             public static void main(String[] args) {

                           //객체 생성

                           Score s = new Score();

                           //메소드 실행

                           s.info();

 

             }

 

}

package com.test01.chap01;

 

import java.util.Arrays;

 

public class Score {

                     private int kor = 17;

                     private int eng = 10;

                     private int mat = 97;

                     private String name = "김수한무";

                    

                     //생성자

                     public Score() {   }

                    

                     //총합을 구하는 메소드

                     public int tot() {

                           return kor + eng + mat;

                     }

                     //평균 조회

                     public int avg() {

                           return (int)(tot()/3);

                     }

                     //제일 높은 점수를 받은 과목 찾는 메소드

                     public String highScore() {

                           int max = 0;

                           String high = "";

                          

                           if(kor > eng) {

                                        if(kor > mat) {

                                                     max = kor;

                                                     high = "국어";

                                        }

                                        else {

                                                     max = mat;

                                                     high = "수학";

                                        }

                           }

                           else {

                                        if(eng > mat) {

                                                     max = eng;

                                                     high = "영어";

                                        }

                                        else {

                                                     max = mat;

                                                     high = "수학";

                                        }

                           }

                          

                           return high;

                          

                     }

                     //제일 낮은 점수 과목

                     public String lowScore() {

                           int min = 101;

                           String low = "";

                          

                           if(kor < eng) {

                                        if(kor < mat) {

                                                     min = kor;

                                                     low = "국어";

                                        }

                                        else {

                                                     min = mat;

                                                     low = "수학";

                                        }

                           }

                           else {

                                        if(eng < mat) {

                                                     min = eng;

                                                     low = "영어";

                                        }

                                        else {

                                                     min = mat;

                                                     low = "수학";

                                        }

                           }

                           return low;

                          

                     }

                     //평균 점수 확인하고 등급 나누기

                     public String grade() {

                          

                           int myAvg = avg();

                           String myGrade = "";

                          

                           if(myAvg <= 100 && myAvg >= 90) {

                                        myGrade = "A";

                           }

                           else if(myAvg < 90 && myAvg >= 80) {

                                        myGrade = "B";

                           }

                           else if(myAvg < 80 && myAvg >= 70) {

                                        myGrade = "C";

                           }

                           else if(myAvg < 70 && myAvg >= 60) {

                                        myGrade = "D";

                           }

                           else {

                                        myGrade = "F";

                           }

                          

                           return myGrade;

                     }

                    

                     //저장된 필드값을 확인 할 수 있는 info메소드

                     public void info() {

                           System.out.println("----------");

                           System.out.println(name + "님의 점수");

                           System.out.println("국어 = " + kor + "\t 영어 = " + eng + "\t 수학 = " + mat);

                           System.out.println("총점 = " + tot());

                           System.out.println("평균 = " + avg());

                           System.out.println("국어 영어 수학 중 가장 높은 점수의 과목은  " + highScore()
                                                    + "이고, 가장 낮은 점수의 과목은 " + lowScore() + " 입니다. ");

                          

                           System.out.println("등급 = " + grade());

                          

                           System.out.println("----------");

        

                     }

 

}

 

 

 

package com.test01.chap01;

 

public class Main {

 

             public static void main(String[] args) {

                           //객체 생성

                           Account a = new Account();

 

                           //잔액 조회

                           a.display();

                          

                           //100만원 입금

                           a.in(1000000);

                          

                           //잔액 조회

                           a.display();

                          

                           //추가 입금 150만원

                           a.in(1500000);

                          

                           //잔액 조회

                           a.display();

             }

 

}

package com.test01.chap01;

 

public class Account {

 

             private int balance;

             private String name = "햄서터";

            

             public Account() {

                          

             }

            

             //입금

             public void in(int money) {

                           if(money > 0 ) {

                                        balance += money;

                                        System.out.println(name + "님의 계좌에 " + money + "원이 입금 되었습니다.");

                           }

                           else {

                                        System.out.println("잘못된 금액이 입금되었습니다.");

                           }

                          

             }

            

             //출금

             public void out(int money) {

                           if(money <= balance) {

                                        balance -= money;

                                        System.out.println(name + "님의 계좌에서 " + money + "원이 출금 되었습니다.");

                           }

                           else {

                                        System.out.println("잔액이 부족합니다.");

                           }

             }

            

             //잔액조회

             public void display() {

                           System.out.println(name + "님의 계좌 잔액은 " + balance + "원 입니다.");

             }

            

}