클래스와 객체
객체지향 프로그래밍이란 객체가 중심이 되는 프로그래밍 패러다임을 일컷는 용어입니다.
객체 (object)
- 사전적 의미 : 어떠한 물건이나 대상
- 프로그래밍에서의 의미 : 프로그램에서 표현하고자 하는 기능을 묶기 위한 단위
객체를 구성하는 단위
- 객체를 이루는 것은 데이터와 기능이다.
- 데이터는 변수로 표현된다.
- 객체 안에 포함된 변수를 멤버변수 혹은 프로퍼티라 한다.
- 기능은 메서드(=함수)로 표현한다.
클래스(Class)
객체의 설계도 역할을 하는 프로그램 소스
공장에서 하나의 설계도를 사용하여 여러개의 제품을 생산할 수 있는 것처럼 하나의 클래스를 통해 동일한 구조를 잦는 객체를 여러 개 생성할 수 있다.
클래스의가장 기본적인 코드 형식
class 클래스이름{
//변수들 선언부분
//메서드 정의부분
}
클래스 이름은 명사들의 조합으로 이루어지며 첫 글자는 대문자로 지정하는 것이 관례이다.
클래스를 통한 객체 생성하기
new
예약어를 사용한다.
클래스이름 변수이름 = new 클래스이름();
위와 같이 정의하면 변수는 클래스 안에 정의된 모든 기능을 부여받은 특수한 형태의 변수가 되는데 이를 객체라고 한다.
객체에게 부여된 기능은 점 (.)을 통해 접근할 수 있다.
객체.멤버변수 = 값;
객체.메서드();
클래스의 작성 패턴
- 변수만 정의
- 메서드만 정의
- 변수와 메서드를 함께 정의
객체라는 개념은 배열이 같은 종류의 변수들만 그룹화 하는 한계를 벗어나 서로 다른 종류의 변수를 그룹화 하는데서 출발한다. (이 상태를 C언의 구조체라고 한다.)
그렇게 그룹화 해 놓은 변수들간의 관계를 구현하기 위해 메서드를 함께 포함하는 형태로 발전된 것이다.
SimpleMember.java
멤버변수만을 정의한 클래스
// public 클래스는 하나의 소스파일에서 단 하나만 존재할 수 있다.
class Member {
String userName = "아무개";
String email = "EMAIL@eaail.com";
int age = 26;
}
// public 클래스의 이름은 소스파일 이름과 동일해야 한다.
public class SimpleMember{
public static void main(String [] args){
// 같은 클래스에서 생성된 두 개의 객체는 동일한 구조와 값을 갖는다.
Member m1 = new Member();
System.out.println(m1.userName);
System.out.println(m1.email);
System.out.println(m1.age);
Member m2 = new Member();
System.out.println(m2.userName);
System.out.println(m2.email);
System.out.println(m2.age);
}
}
결과출력
아무개
EMAIL@eaail.com
26
아무개
EMAIL@eaail.com
26
// public 클래스는 하나의 소스파일에서 단 하나만 존재할 수 있다.
class Member {
String userName = "아무개";
String email = "aaa@aaa.com";
int age = 26;
}
// public 클래스의 이름은 소스파일 이름과 동일해야 한다.
public class SimpleMember{
public static void main(String [] args){
// 같은 클래스에서 생성된 두 개의 객체는 동일한 구조와 값을 갖는다.
Member m1 = new Member();
System.out.println(m1.userName);
System.out.println(m1.email);
System.out.println(m1.age);
Member m2 = new Member();
System.out.println(m2.userName);
System.out.println(m2.email);
System.out.println(m2.age);
// 이렇게 생성된 객체들은 서로 개별적인 값을 갖도록 수정 할 수 있다.
m1.userName = "민혁";
m1.email = "mh@gamil.com";
m1.age = 20;
m2.userName = "철수";
m2.email = "cs@gamil.com";
m2.age = 19;
System.out.println(m1.userName);
System.out.println(m1.email);
System.out.println(m1.age);
System.out.println(m2.userName);
System.out.println(m2.email);
System.out.println(m2.age);
}
}
출력결과
아무개
aaa@aaa.com
26
아무개
aaa@aaa.com
26
민혁
mh@gamil.com
20
철수
cs@gamil.com
19
SimpleClac.java
메서드만 정의
용도나 목적이 같은 메서드들을 별도의 클래스로 묶어둔다.
class Calc{
// 일반적인 클래스에서 static은 특별한 경우에만 사용한다. (뒤에서 다룸)
public int plus(int x, int y){
return x + y;
}
public int minus(int x, int y) {
return x - y;
}
}
public class SimpleCalc {
public static void main(String[] args){
Calc c = new Calc();
System.out.println(c.plus(1, 2));
System.out.println(c.minus(10, 5));
}
}
출력결과
3
5
메서드와 변수를 함께 갖는 클래스
SimpleAccount.java
class Account {
/** 멤버변수 영역*/
// 멤버변수의 스코프는 클래스 내의 모든 메서드에서 식별 가능하다.
// 결국 멤버변수는 모든 메서드가 공유하는 전역 변수의 개념이 된다.
// 메서드 안에서 파라미터나 일반 변수와 구분하기 위해
// 멤버변수 앞에는 "this"를 적용할 수 있다.
// --> this는 현재 객체라는 의미
String name;
int age;
String getName() { return this.name; }
void setName(String name) { this.name = name; }
int getAge() { return this.age; }
void setAge(int age) { this.age = age;}
void say() {
System.out.println(this.getName());
System.out.println(this.getAge());
}
}
public class SimpleAccount{
public static void main(String[] args){
Account user = new Account();
user.setName("자바학생");
user.setAge(20);
user.say();
}
}
출력결과
자바학생
20
SimpleMessage.java
class HelloWorld {
/** 멤버변수 영역 */
// 멤버변수의 스코프는 클래스 내의 모든 메서드에서 식별 가능하다.
// 결국 멤버변수는 모든 메서드가 공유하는 전역 변수의 개념이 된다.
String message;
void sayHello() { System.out.println(message); }
void setEng() { message = "hello Java"; }
void setKor() { message = "안녕하세요. 자바"; }
}
public class SimpleMessage {
public static void main( String[] args) {
HelloWorld hello = new HelloWorld();
// 메서드 호출
hello.setEng();
hello.sayHello();
hello.setKor();
hello.sayHello();
}
}
출력결과
hello Java
안녕하세요. 자바
메서드를 포함하는 클래스
- 메서드란 프로그램에서 하나의 동작 단위를 의미한다.
- 두 개이상의 메서드가 서로 동일한 대상을 위해서 존재할 경우, 이 메서드들을 클래스에 포함시켜 그룹화 할 수 있다.
- 클래스에 멤버변수와 메서드가 공존할 경우, 멤버변수는 모든 메서드가 공유하는 전역 변수로 존재하게 된다.
this
자기 자신을 의미하는 키워드
- 클래스 안에서 this를 사용하여 "자기자신"을 표현한다.
this를 사용하여 지역변수와 멤버변수 구분하기
아래의 코드 6라인에서 대입되는 값은 5라인에서 선언된'name'이다. 멤버변수와 지역변수가 동일한 이름으로 공존할 경우, 유효성 범위가 작은 변수가 우선적으로 인식된다.
class Foo{ String name; public void setName() { String name; name = "뚬땜이"; } }
this를 사용하여 지역변수와 멤버변수 구분하기(2)
7라인에서 사용하는 name은 현재 클래스 자신의 변수 즉, 멤버변수로 선언된 name을 의미한다.
class Foo{ String name; public void setName() { String name; name = "뚬땜이"; this.name = "뚬땜이"; } }