노승현
클래스 본문
객체와 객체 지향 프로그래밍(OOP : Object-Oriented Programming)
객체 지향 프로그래밍이란?
여기서 객체는, 우리 실생활에 존재하는 모든 것으로 생각할 수 있습니다. 예를 들면,
눈에 보이는 컴퓨터, 연필, 책등과 같은 사물부터 학생, 선생님과 같은 인물이 될 수도 있습니다.
또한 수업이나 시험과 같이 눈에 보이지 않는 것도 객체가 될 수 있습니다.
객체는 일반적으로 상태를 표현할 수 있고 우리가 행동으로 실행할 수 있는 모든 것을 말합니다.
우리는 이런 객체를 중심으로 프로그램 구조를 설계하고 프로그래밍 하는 것을 객체 지향 프로그래밍이라고 합니다.
1. 클래스란?
객체 지향 언어에서 가장 중요한 용어인 클래스는 한마디로 객체를 생성하기 위한 제작 설명서입니다.
쉽게 말해 어떤 물건을 만들 수 있듯이, 자바에서는 하나의 클래스로 여러 개의 객체를 생성하고 사용할 수 있습니다.
2. 클래스 선언
public class Car{ // Car 클래스 선언
}
클래스의 용도
* 실행용 : 프로그램 전체에서 단 하나의 클래스로, 프로그램의 실행을 전적으로 맡고 있다.
프로그램의 시작 메서드인 main()을 가지고 있는 클래스를 말하며, 다른 클래스에서 사용하지 않는다.
* 라이브러리용 : 다른 클래스에서 이용할 목적으로 선언되는 클래스
하나의 클래스가 위의 두 가지 용도의 역할을 모두 수행할 수 있다.
유지 보수와 객체 지향 프로그래밍의 특징인 모듈화를 고려해 별도로 분리하여 작성하는 것이 좋다.
접근제한자 class 클래스이름{
}
접근제한자 : 변수와 마찬가지로 클래스의 접근 범위를 제한한다.
class : class를 선언함을 뜻한다.
클래스 이름 : 변수처럼 이름을 가지고, 객체를 생성할 때 사용한다.
3. 클래스의 구성
1 클래스 구성
[클래스를 구성하는 3가지 요소]
* 필드 (field)
* 메서드 (method)
* 생성자 (constructor)
-각 요소들은 필요에 따라 생략하거나 2개 이상 작성할 수 있다.
2 필드 (Field)
-객체가 가져야 할 데이터 상태를 저장하는 변수
-단, 변수라 부르지 않고 필드라고 부른다.
-클래스 내에 정의되고 객체가 생성될 때 그 객체와 함께 존재하는 데이터
public class Car { //클래스 선언
int wheel = 4; //필드 선언 & 초기화
// 물론 선언과 초기화를 나눠서 작성할 수 있다.
}
필드의 사용
-필드를 선언했으면 사용도 해야한다.
-변수와 마찬가지로 필드의 값을 읽거나 변경할 수 있다.
-클래스 안에 선언된 변수이기 때문에, 클래스 안에서는 기존에 변수를 사용했던 것처럼 사용할 수 있다.
-필드를 선언한 클래스가 아닌 다른 클래스에서 사용하는 법
-필드는 클래스에 포함된 요소이자, 객체를 생성한 후 객체가 가지는 데이터이기도 하다.
-객체를 생성한 후 그 객체의 필드를 사용할 수 있다.
-객체의 데이터, 즉 필드에 접근하는 방법
객체명.필드명
객체명 : 클래스를 이용해 만든 객체 이름
필드명 : 만든 객체가 가지고 있는 필드 이름
3 메서드 (method)
-객체의 기능을 담당하는 중괄호{} 블럭이다.
-특정 기능을 수행하는 코드를 따로 빼서 중괄호 안에 작성하며, 1개의 메서드는 일반적으로 1개의 기능을 수행한다.
-메서드는 일반적으로 1개의 기능을 수행한다.
반환타입 메서드명() {
//기능을 수행할 코드 작성
}
-메서드를 호출하면 블록 안에 있는 코드들이 위에서부터 순차적으로 모두 실행되고 경우에 따라 실행한 결과를 호출한 곳으로 다시 돌려준다.
-"반환한다"라고 표현하고 반환하는 결과값을 "리턴값"이라고 부른다.
-리턴값이 있을 경우에는 리턴할 데이터의 형태가 무엇인지 메서드명() 앞에 반환 타입으로 기재해 주어야 한다.
리턴값이 있을 경우 : 리턴값의 자료형을 반환 타입으로 작성합니다.
리턴값이 없을 경우 : 반환 타입을 void 라고 작성합니다.
[메서드 사용]
-구현한 메서드를 사용하는 방법은, 필드의 사용법과 동일하다.
-메서드를 선언한 클래스 안에서 메서드를 사용할 때는 단순히 메서드명만 호출하면 되지만, 다른 클래스에서 메서드를 사용하려면
"객체를 먼저 생성한 후" 참조 변수를 이용해 그 객체의 메서드를 사용해야한다.
객체가 존재해야 메서드도 존재한다.
클래스명 객체명 = 클래스명(); //객체 생성
객체명.메서드명(); //생성한 객체의 메서드 호출(사용)
4 생성자 (constructor)
-객체를 생성할 때 반드시 호출해야 하는 메서드가 있다.
-객체를 생성하면서 객체 변수를 초기화하는 역할을 하는데, 이를 생성자 라고 부른다.
클래스명 객체명 = new 클래스명();
new 클래스명(); => 생성자 메서드
-생성자라는 메서드는 클래스명과 이름이 같다.
-하지만 우리는 이런 메서드를 생성한 적이 없음에도 생성자를 호출하여 객체를 생성해왔다.
-그 이유는 우리가 직접 선언하지 않아도 기본 생성자가 자동으로 생성되고 우리 눈에만 보이지 않기 때문이다.
package section07;
public class Car { //클래스 선언
int wheel = 4; //클래스 필드 선언 및 초기화
Car() { //기본 생성자 - 우리 눈에는 보이지 않음
// 안에는 텅 비어있다.
}
void ride() { //메서드 선언
System.out.println ("달립니다.");
}
}
우리가 보기에는 텅 비어있는 이러한 생성자를 통해 객체를 생성해야하는 이유는?
생성자를 통해 객체 변수를 초기화한다는것은, 단순히 어떠한 값을 초기화한다는 뜻이 아니다.
필드와 메서드를 호출하는 등 객체를 사용하기 위해서 객체 변수가 메모리에 올라가야 하는데,
이렇게 메모리에 객체 변수를 올려주는 역할을 생성자가 해준다.
* 생성자가 없는 클래스는 없다.
생략되었다고 해서 클래스에 없는 것이 아니라, 눈에 보이지 않을 뿐이다.
정적 멤버와 static
인스턴스 멤버와 정적 멤버
-클래스 안에 선언된 필드와 메서드를 클래스 멤버라고 부른다.
-클래스에 포함된 요소라는 의미로 '멤버'라는 용어를 사용한다.
-클래스를 이용해서 객체를 생성할 때 모든 클래스 멤버가 각 객체의 멤버로 생성되는 걸까요?
-모든 객체가 동일한 값을 가져야 한다는 가정을 해보면,
ex) 한집에 함께 사는 가족 구성원들을 생각해보면
구성원의 이름과 나이는 모든 객체가 다르지만 한집에 함께 살기 때문에 구성원의 주소는 모든 객체가 동일할 것이다.
static 키워드
-static 의 사전적 의미는 '고정된(형용사)'라는 뜻을 가지고 있다.
-프로그래밍 언어에서 static 은 이러한 의미를 바탕으로 '클래스에 고정되었다'라는 의미로 사용된다.
-쉽게 말해 객체가 아닌 클래스에 의존적인 요소라고 생각할 수 있다.
-static 이 앞에 붙은 멤버들은 다른 멤버들과 다르게 객체를 생성하지 않고 바로 사용할 수 있다.
-객체를 생성할 때 메모리에 올라가는 것이 아니라, 프로그램을 시작할 때 메모리에 올라가고 프로그램이 종료될 때
메모리에서 사라지기 때문이다.
-메서드 안에 지역변수는 static 으로 선언할 수 없다.
-정적 멤버의 경우, 객체마다 가지는 데이터 기능이 아니기 때문에 모든 객체가 같은 값을 가져야 할 경우에 사용하는 것이 효율적이다.
-학생의 이름은 각 객체가 가져야 할 데이터라서 정적 필드가 아닌 인스턴스 필드로 선언해야한다.
'JAVA > Mentor JAVA' 카테고리의 다른 글
생성자란? (1) | 2024.01.01 |
---|---|
메서드란? (0) | 2023.12.28 |
배열이란? (0) | 2023.12.24 |
제어문이란? (2) (1) | 2023.12.20 |
제어문이란? (0) | 2023.12.18 |