객체 : 물리적으로 존재(자동차, 책, 사람)하거나 추상적(강의, 생각, 회사)으로 생각할 수 있는 것 중에서 자신의 속성을 가지며 식별 가능한 것. 객체는 속성(사람은 이름, 나이)과 동작(자동차가 달린다, 정지한다)으로 구성되어 있으며 자바는 이 속성을 필드, 동작을 메소드라고 부른다. ex) 자동차(객체) - 색깔, 속도(필드) - 달린다, 멈춘다(메소드)
객체지향프로그래밍 : 객체를 만들고 이를 조립해 완성된 프로그램을 만드는 기법
객체 모델링 : 현실세계의 객체의 속성과 동작을 소프트웨어 객체의 필드와 메소드로 설계하는 것
객체의 상호작용 : 객체들은 각각 독립적으로 존재하지만, 메소드를 통해 서로 다른 객체들과 상호 작용을 한다. 이때 객체가 다른 객체의 기능을 이용하는 것을 메소드 호출이라고 한다.
메소드 호출 형태 : Calculator.add(10,20)메소드 호출, 결과값을 int 변수에 저장
객체 간의 관계 집합 관계 : 부품(엔진, 타이어, 핸들)객체와 완성품(자동차) 객체 간의 관계 사용 관계 : 객체와(사람) 객체간의(자동차) 상호작용 상속 관계 : 상위(부모) 객체를 기반으로 하위(자식) 객체를 생성. ex)기계(상위), 자동차(하위)
-> 객체지향프로그래밍은 만들고자하는 완성품 객체를 모델링하고, 집합 관계에 있는 부품 객체와 사용 관계에 있는 객체를 하나씩 설계한 후 조립하는 방식으로 프로그램을 개발한다.
객체와 클래스 : 객체(자동차)는 클래스(설계도)를 바탕으로 만들어진다. 따라서 사용하고 싶은 객체가 있으면 설계도로 해당 객체를 만드는 작업이 필요하다. 자바의 경우 설계도는 클래스(class)이다. 또한 클래스(설계도)에는 객체(자동차)를 설계하기 위한 필드(색깔, 속도)와 메소드(달린다. 멈춘다)가 정의되어있다. 클래스로부터 만들어진 객체를 인스턴스라고 하는데, 자동차 객체는 자동차 클래스의 인스턴스라고 할 수 있으며 클래스로부터 객체를 만드는 과정을 인스턴스화라고 한다. 하나의 클래스(설계도)로부터는 여러개의 인스턴스(객체-자동차)를 만들 수 있다.
객체지향프로그래밍 개발 단계 1. 클래스 설계 2. 설계된 클래스를 가지고 사용할 객체 생성 3. 생성된 객체 이용 ->main()메소드가 없는 클래스는 객체 생성 과정을 거쳐서 사용해야한다.
클래스 선언 1. 객체 구상 후 클래스 이름을 결정 자바의 식별자 작성 규칙에 따라야함. -하나 이상의 문자로 이루어질 것 -첫 글자는 숫자가 올 수 없음 -$, _ 이외의 특수문자는 사용할 수 없음 -자바 키워드는 사용할 수 없음(int, for -> x) -첫글자는 대문자(관례) (Car, ChatServer) 2. '클래스 이름.java'로 소스 파일 생성 3. 소스 파일을 열고 클래스 선언. 클래스 이름 뒤에는 반드시 중괄호 {} 필요. 소스 파일 하나에 2개 이상의 클래스 선언도 가능. 만약 2개 이상의 클래스가 선언된 경우 바이트 코드 파일(.class)는 클래스를 선언한 개수만큼 생성됨.
객체 생성과 변수 : 클래스 선언 이후 컴파일(저장)을 했다면 객체를 생성할 설계도가 만들어진 것이다. 클래스(설계도)로부터 객체(자동차)를 생성하려면 new 연산자를 사용해야한다. new 연산자는 클래스로부터 객체를 생성하는 연산자이며 new연산자 뒤에는 클래스() 형태의 생성자가 온다. 또한 new 연산자로 생성된 객체는 메모리 힙 영역에 생성되고, 객체가 힙 영역에 생성된 후 객체의 번지가 리턴된다. 이 주소를 클래스 변수에 저장하여 객체 사용이 가능하다.
ex) new 클래스(); -> new 연산자 뒤에는 클래스()형태의 생성자가 온다. ex) 클래스 변수; -> 클래스로 선언된 변수 변수 = new 클래스(); -> 위 변수에 new 연산자가 리턴한 객체의 번지를 저장한다. 클래스변수 = new 클래스(); -> 클래스 변수 선언과 객체 생성을 1개의 실행문으로도 작성 가능
객체 생성과 클래스 변수
publicclass Student { //Student 클래스 선언 : 객체 구상 후 클래스 이름(Student) 결정 //클래스이름.java로 소스파일 생성(이클립스에서는 저장) }
publicclass StudentEx { publicstaticvoid main(String[] args) { //Ex클래스의 main()메소드에 Student객체 생성 Student s1 = new Student(); System.out.println("s1변수가 Student 객체를 참조합니다."); Student s2 = new Student(); System.out.println("s2변수가 Student 객체를 참조합니다."); //클래스로 선언된 변수에 new연산자가 리턴한 객체의 번지를 저장 //new연산자가 객체를 생성하고 리턴된 객체의 번지를 변수에 저장하면 변수가 객체를 참조하게됨. /*Student클래스는 하나지만 new연산자를 사용한 만큼 객체가 메모리에 생성되고, 이러한 객체들은 Student클래스의 인스턴스이다. 따라서 s1과 s2가 참조하는 Student객체는 완전히 독립된 서로 다른 객체*/ } } 실행결과 :
s1변수가 Student 객체를 참조합니다. s2변수가 Student 객체를 참조합니다.
-> 스택영역[s1() s2()] / 힙영역[Stundent객체(s1변수가 참조) Stundent객체(s2변수가 참조) ]
클래스의 두 용도 1. 라이브러리(API : Application Program Interface) : 객체 생성 및 메소드 제공 역할 - Student.java 2. 실행 클래스 : main() 메소드 제공 역할 - StudentEx.java
클래스의 구성 멤버 -필드 : 객체의 데이터가 저장되는 곳. 선언 형태는 변수와 유사하지만 다름. 필드는 생성자와 메소드 전체에서 사용되며 객체가 소멸되지않는 한 객체와 함께 존재. 변수는 생성자와 메소드 내에서만 사용되고 실행이 종료되면 자동 소멸.
-생성자 : 객체 생성 시 초기화를 하는 역할 담당. 클래스와 동일한 이름을 가져야한다. 메소드와 유사하지만, 클래스 이름으로 되어있고 리턴 타입이 없다.
-메소드 : 객체의 동작에 해당하는 실행 블록. 객체 간의 데이터를 전달하는 수단이다. 외부(호출한 곳)으로부터 매개값을 받아 실행에 이요하고, 실행후 결과 값을 리턴할 수 있다.
publicclass Member { //필드 : 객체의 데이터를 저장 String name; //생성자 : 객체 생성 시 초기화. 클래스 이름과 동일 Member(String name){...} //메소드 : 객체의 동작에 해당하는 실행 블록(여기서 중괄호블록의 이름 setName을 메소드 이름이라고 함) void setName(String name){...} }