티스토리 뷰

5-1.

  1. 객체 지향 프로그래밍과 클래스
    • 객체와 객체 지향 프로그래밍
      • 객체 : 주문, 생산 , 관리 ,,,,(안보이는 것) + 사람 , 자동차,건물 (보이는것)
      • 객체 지향 프로그래밍 : 어떤 대상(객체)을 가지고 프로그래밍하는 것
    • 생활 속의 객체
      • 절차 지향 프로그래밍
        • 일어나는 일을 시간순으로 프로그래밍
      • 객체 지향 프로그래밍
        • 객체의 정의하고 객체 간 협력을 프로그래밍
    • 클래스
      • 클래스를 정의한다
        • 객체를 클래스로 구현하는 것
      • 멤버 변수
        • 클래스의 속성..
      class Student {
            int studentID; //학번
            String studentName; //학생 이름
            int grade; // 학년
            String address; // 사는 곳곳
      }
      • 클래스를 만들떄 class 예약어 사용
      • 사용할 객체의 속성 > 클래스의 변수로 선언
      • 모든 요소가 클래스 내부에 있음
      • 클래스 명명 규칙
        • 대문자 시작
        • 코딩 컨벤션
          • 코딩할 떄 읽기 쉽고 이해하기 쉽도록 정한 규칙

05.2 클래스 살펴보기

  • 클래스 속성을 구현하는 멤버 변수
    class Person {
          String name; //이름
          int height; //키
          double weight; //몸무게
          char gender; //성별
          boolean married; //결혼 여부
    }
    • Person클래스의 멤버 변수로 이름 , 키 , 몸무게 , 성별 , 결혼 여부 ...
    • 기본 자료형 , 또 다른 클래스형으로 선언가능
    • 클래스형
      • 객체 자료형 또는 참조자료형
      • String, Date 같이 이미 JDK에서 제공하는 것 혹은 개발자가 직접만든 Student 나 Person 같은 클래스가 다른 클래스에서 사용하는 멤버 변수의 자료형일 수 있음
  • 클래스 기능을 구현하는 메서드
    • 멤버 함수
      • 클래스 내부에서 멤버 변수를 사용하여 클래스 기능을 구현
      class Student {
            int studentID; //학번
            String studentName; //학생 이름
            int grade; // 학년
            String address; // 사는 곳곳
      
            public void showStudentInfo() {
                  System.out.println(studentName + " , " + address);
                  
            }
      }
  • 패키지
    • 클래스 파일의 묶음
    • 프로젝트 하위에 물리적인 디렉터리가 생성됨
    • 대분류별로 정리해서 유지보수 및 소스 코드 관리가 편함
    • 패키지 선언
      • 클래스 전체 이름
        • package kr.or.test

  • 05.3 메서드
    • 함수의 한 종류
    • 함수란?
      • 하나의 기능을 수행하는 일련의 코드
    • 함수의 입력과 반환
      • 이름 : 의미를 알 수 있는 단어를 사용하는 것이 좋다
        • ex ) add,
      • 파라미터 (매개변수)
        • 함수의 입력으로 받는 변수
      • 반환 값
        • 함수를 수행한 후 결과로 되돌려주는 값
    • 함수 정의
      • 함수가 하는 일을 코드로 구현하는 것
      int add(int num1, int num2){
      	int result;
      	result = num1 + num2;
      	return result;
      
      }
      //매개변수가 존재하는 함수
      
      int getTenTotal(){
      	int i;
      	int total = 0;
      	for(i = 1;i <=10;i++){
      		total += i;
      	}
      		
      	return total ; //1부터 10 까지 더한 값을 반환합니다
      
      }
      //매개변수가 존재하지 않는 함수
      void printGreeting(String studentName) {
                  System.out.println("studentName = " + studentName + "님 안녕하세요?");
            }
      //반환값이 없는 함수
      
      void divide(int num1, int num2) {
                  if (num2 == 0) {
                        System.out.println("나누는 수는 0이 될 수 없습니다");
                        return; //함수의 수행 종료
                  } else {
                        int result = num1 / num2;
                        System.out.println(num1 + "/" + num2 + "=" + result + " 입니다");
                        
                  }
                  
            }
      // return으로 함수 수행을 끝내고 프로그램 흐름 중에 호출한 곳으로 다시 되돌아갈 떄도 사용이 가능하다
      • 나누는 수가 0이라면 수행하면 안돼지!
      • 이때 함수의 수행을 종료하는 예약어 return 을 사용합니다
    • 함수 호출하고 값 반환
      • 함수의 호출
        • 함수를 사용하는 것
      • 함수 구현하고 호출하기
        class FunctionTest {
              public static void main(String[] args) {
                    int num1 = 10;
                    int num2 = 20;
        
                    int sum = add(num1, num2); //함수 호출
        
                    System.out.println("sum = " + sum);
                    System.out.println("========================");
              }
        
              static int add(int n1, int n2) { //
                    int result = n1 + n2;
                    return result; //결과 값의 반환
              }
        }
        • 매개변수는 함수에서 새로 선언한 변수입니다.
        • 함수를 호출할 때 사용하는 변수 이름과 호출되는 함수에서 사용하는 변수는 서로 다른 변수 > 이름이 달라도 상관없습니다
    • 함수 호출과 스택 메모리
      1. 함수 호출
      1. 메모리 공간의 할당
        1. 메모리 공간 : 스택(stack)
        1. main 함수 포함된 변수.... 저장할 메모리 공간 생성
        1. add 함수 호출시 add함수를 저장할 메모리 공간이 스택에 새롭게 생성
        1. add 함수 수행이 끝나면 >함수에 할당한 메모리 공간을 해제하는 과정이 수행됨
      1. Main() 함수안에서 사용하는 변수와 add라는 함수안에서의 변수는 서로 다른 메모리 공간을 사용하기에 이름이 서로 달라도 문제 없습니다
        • 함수 내부에서 사용하는 변수 : 지역 변수
        • 지역 변수는 스택 메모리에 생성
    • 함수의 장점
      1. 함수를 사용하면 기능을 나누어 코드를 효율적으로 구현가능
      1. 기능별 함수 구현 : 같은 기능을 매번 코드로 만들지 않고 그 기능의 함수를 호출하면 편리합니다
      • 하나의 함수에 하나의 기능!!!!!
    • 클래스 기능을 구현하는 메서드
      • 메서드
        • 멤버 변수를 사용하여 클래스의 기능을 구현
        • 함수에 객체 지향 개념이 포함된 용어입니다

      class Student {
            int studentID;
            String studentName;
            int grade;
            String address;
      
            public String getStudentName() {
                  return studentName;
            }//학생의 이름을 return!
      			public Student(String studentName) {
                  this.studentName = studentName;
            }//학생의 이름을 set!
      
      			
      			
      }
      
      
      • 자바의 네이밍 규약
        • 클래스 이름은 대문자
        • public 클래스와 자바 파일 이름을 동일해야함
        • 패지키 이름 모두 소문자
        • 변수. 메서드 소문자 시작 | 길어지는 경우 중간에 새 단어로 바뀔때 마다 대문자 → 가독성 UP > 카멜 표기법 (camel notation)

05.4 클래스와 인스턴스

  • 클래스 사용과 main() 함수
    • 프로그램을 시작하는 main 함수
      • 자바 가상 머신 (JVM : Java Virtual Machine) 이 프로그램을 시작하기 위해 호출하는 함수
    • Student 클래스에 main 함수 포함하기
      public static void main(String[] args) {
                  Student studentPark = new Student();
                  studentPark.setStudentName("박상준");
      
                  System.out.println("studentPark = " + studentPark.getStudentName());
                  System.out.println("========================");
      
            }
    • 인지
      • 클래스 이름이 같아도 패키지가 다르면 다른 클래스
        • aaa 패키지 ,bbb 패키지 존재 > 패키지 하위의 Student 클래스의 실제 이름 aaa.Student , bbb.Student
  • new 예약어로 클래스 생성하기
    • 클래스 생성
      클래스형 변수 이름 = new 생성자;
      • 클래스를 실제 사용할 수 있도록 메모리 공간( 힙 메모리 )을 할당 받는다는 의미
      • 이렇게 실제로 사용할 수 있도록 생성된 클래스를 인스턴스 라고 함
      • 참조변수
        • 인스턴스를 가리키는 클래스형 변수 ⇒ studentPark ⇒ 이 변수가 생성된 인스턴스를 가리킴!!
  • 인스턴스와 참조 변수
    • 객체, 클래스, 인스턴스
      • 객체
        • 의사나 행위가 미치는 대상 (클래스의 타입으로 선언된 것)
      • 클래스
        • 객체를 코드로 구현한 것
      • 인스턴스
        • 클래스가 메모리 공간에 생성된 상태 (메모리에 할당되었을때 =인스턴스)
        • 클래스의 생성자 호출 → 인스턴스 생성
    • 인스턴스 여러개 생성하기
      class StudentTest1 {
            public static void main(String[] args) {
                  Student student1 = new Student();
                  student1.studentName = "박상준";
                  System.out.println(student1.getStudentName());
                  System.out.println("========================");
                  Student student2 = new Student();
                  student2.studentName = "김상준";
                  System.out.println(student2.getStudentName());
                  System.out.println("========================");
            }
      }
      //생성자 2번 사용해서 서로 다른 변수 이름으로 클래스를 2개를 생성함
      	> 서로 다른 인스턴스가 2개 생성
    • 참조 변수 사용하기
      • student1.studentName →참조변수로 studentName 멤버 변수에 이름 저장
  • 인스턴스와 힙 메모리
    • 힙 메모리
      • 클래스의 멤버변수를 저장하는 메모리 공간
      • 클래스 생성자는 하나 호출 시 힙 메모리에 생성됨
        Student student1 = new Student(); //호출시 힙 메모리에 생성
      • 스택메모리의 student1이 힙 메모리에 생긴 인스턴스 (Student 클래스) 를 가리킵니다
      • 지역변수 student1에 생성된 인스턴스를 대입 == student1에 인스턴스가 생성된 힙 메모리의 주소를 대입
    • 힙 메모리란?
        • 프로그램에서 사용하는 동적 메모리(dynamic memory) 공간
        • 동적으로 할당되며 사용이 끝나면 자바에서는 자동으로 메모리 해체합니다
    • 참조 변수와 참조 값
      • 참조변수
        • 힙 메모리에 생성된 인스턴스
        • 참조 값 출력하기
        class StudentTest2 {
              public static void main(String[] args) {
                    Student student1 = new Student();
                    student1.studentName = "박상준";
        
                    Student student2 = new Student();
                    student2.studentName = "김상준";
        
                    System.out.println("student1 = " + student1); //참조변수의 값이 출력됩니다! > 클래스이름@주소값(해시코드값)
                    System.out.println("student2 = " + student2);
                    System.out.println("========================");
              }
        }


05.5 생성자

  • 생성자란
    • 생성자
      Person personLee = new (Person())<- 요 부분이 생성자입니다
      • 클래스를 처음 만들때 멤버 변수나 상수을 초기화
    • 디폴트 생성자
      • 생성자가 없는 클래스는 클래스 파일을 컴파일할 때 자바 컴파일러에서 자동으로 생성자를 만듬
      • 매개변수 X 구현 코드 X
      public Person(){ }
  • 생성자 만들기
    • 역할
      • 멤버 변수에 대한 값들을 매개변수로 받아서 인스턴스가 새로 생성될 때 멤버 변수 값들을 초기화하는 역할
    public Person(int age, String name, boolean isMarried, int kidCount) {
                this.age = age;
                this.name = name;
                this.isMarried = isMarried;
                this.kidCount = kidCount;
          }
    • 생성자!
    psvm
    Person personLee = new Person(); 
    //Person 객체에 오류가 발생합니다
    • 오류난 이유!
      • 생성자를 직접 구현하여 디폴트 생성자가 없음.
      • 자바 컴파일러는 생성자가 하나도 없는 경우 디폴트 생성자를 제공
    • 해결 방안
      • 매개변수가 있는 생성자로 호출
      • 프로그래머가 디폴트 생성자를 추가로 직접 구현
  • 생성자 오버로드
    • 클래스에 생성자가 2개 이상 제공되는 경우
    • Student 클래스
      class Student {
            int studentId;
      
            public Student(int studentId) {
                  this.studentId = studentId;
            }
      }
      //학번이 생성될 때는 반드시 학번이 존재해야한다면!
      //다음처럼 생성자 제공가능
      • 디폴트 생성자 구현 X 이유
        • 무조건 학번을 받아야하니까
        • 생성자가 구현되어 있는 경우 디폴트 생성자를 컴파일러에서 생성해주지 않습니다
      public Person() {
            ;;
            }// 디폴트 생성자
      
            public Person(int age, String name) {
                  this.age = age;
                  this.name = name;
            } //매개변수 2
      • 필요시 생성자를 선택해서 사용해도 됩니다 (생성자 매개변수 순서는 지켜야합니다)

05.6 참조 자료형

  • 참조 자료형
    • 클래스 자료형으로 선언하는 변수?
    class Student1 {
          int studentID;
          String studentName;
          int koreaScore;
          int mathScore;
    
          Subject koreaSubject;
          Subject mathSubject;
    
    }
    • Subject라는 별도의 클래스 분리! 참조 자료형사용
    • JDK 제공 || 프로그래머 필요에 의해 만듭니다
  • 정보 은닉
    • 접근 제어자 (access modifier)
      • 예약어를 사용해 클래스 내부의 변수 || 메서드 || 생성자 에 대한 접근 권한을 설정
      • 종류
        1. public
          • 외부 클래스에서 접근이 가능하며 외부 클래스가 사용할 수 있다
        1. private
          • 외부 클래스에서 접근불가능
        1. 아무것도 없는 경우
          • default - 같은 패키지 내부에서만 접근간으
        1. protected
          • 같은 패키지 내부와 상속 관계의 클래스에서만 접근가능, 그 외 클래스 접근불가능
        <private test>
        class Student {
              int studentID;
              private String studentName;
              int grade;
              String address;
        
              public static void main(String[] args) {
                    Student studentPark = new Student();
                    studentPark.setStudentName("박상준");
        
                    System.out.println("studentPark = " + studentPark.getStudentName());
                    System.out.println("========================");
        
              }
        
              public String getStudentName() {
                    return studentName;
              }
        
              public void setStudentName(String studentName) {
                    this.studentName = studentName;
              }
        //
        }
        class StudentTest1 {
              public static void main(String[] args) {
                    Student student1 = new Student();
                    //student1.studentName = "박상준"; //private으로 이름을 설정시 에러가 발생합니다
                    System.out.println(student1.getStudentName());
                    System.out.println("========================");
                    Student student2 = new Student();
                    //student2.studentName = "김상준";
                    System.out.println(student2.getStudentName());
                    System.out.println("========================");
              }
        }
        • private 으로 설정한 경우 외부 클래스에서 접근할 수 없기에 studentName이라는 멤버변수에 접근 불가능
        • 해결방안
          • public 으로 해당 변수에 대한 접근범위를 설정
          • get() set() 메서드 활용
      • 정보 은닉이란??
        class MyDate {
              public int day;
              public int month;
              public int year;
        
        }
        class MyDate {
              public int day;
              public int month;
              public int year;
        
        }
        
        class MyDateTest {
              public static void main(String[] args) {
                    MyDate date = new MyDate(); 
                    date.year = 2018;
                    date.month = 2;
                    date.day = 31;
                    
                    //해당 클래스의 멤버 변수에 직접적으로 접근이 가능해져버립니다!! > 2월은 31일이 존재할 수 없음!
              }
        }
        class MyDate {
              private int day;
              private int month;
              private int year;
        
              public int getMonth() {
                    return month;
              }
        
              public void setMonth(int month) {
                    this.month = month;
              }
        
              public int getYear() {
                    return year;
              }
        
              public void setYear(int year) {
                    this.year = year;
              }
        
              public int getDay() {
                    return day;
              }
        
              public void setDay(int day) {
                    if (month == 2) {
                          if (day < 1 || day > 28) {
                                System.out.println("오류입니다");
                          } else {
                                this.day = day;
                          }
        
                    } else {
                          this.day = day;
        
                    }
              }
        }
        
        class MyDateTest {
              public static void main(String[] args) {
                    MyDate date = new MyDate();
                    date.setMonth(2);
        
                    date.setDay(31);
        
                    date.setYear(2019);
                    
                    System.out.println(date.getDay());
        
                    //해당 클래스의 멤버 변수에 직접적으로 접근이 가능해져버립니다!! > 2월은 31일이 존재할 수 없음!
              }
        }

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함