JAVA
1. 객체 지향 프로그래밍
객체와 객체 지향 프로그래밍(OOP : Object - Oriented Programming)
객체 지향 프로그래밍이란, 말 그대로 객체를 지향하는 프로그래밍 방법을 말합니다.
여기서 객체는, 우리 실생활에 존재하는 모든 것으로 생각할 수 있습니다.
객체는 일반적으로 상태를 표현할 수 있고 우리가 행동으로 실행할 수 있는 모든 것을 말합니다.
이런 객체를 중심으로 프로그램 구조를 설계하고 프로그래밍 하는 것을 객체 지향 프로그래밍이라고 합니다.
순서대로 일어나는 일을 시간순으로 프로그래밍하는 것을 절차 지향 프로그래밍이라고 합니다. 절차 지향 프로그래밍의 대표적인
프로그램은 C언어가 있습니다.
2. 객체와 클래스
클래스란
객체 지향 언어에서 가장 중요한 용어인 클래스는 한마디로 객체를 생성하기 위한 제작 설명서입니다.
쉽게 말해 어떤 물건을 만들기 위한 메뉴얼이라고 생각할 수 있습니다. 하나의 설명서로 여러 개의 물건을 만들 수
있듯이, 자바에서는 하나의 클래스로 여러 개의 객체를 생성하고 사용할 수 있습니다.
만들고자 하는 객체들을 먼저 생각하고, 그 객체들을 대표할 수 있는 또는 공통적인 특징을 클래스로 만들어 사용하면,
하나의 클래스로 더욱 많은 객체를 구현할 수 있습니다.
클래스 선언
클래스의 기본 구조는 다음과 같습니다.
public class Car{ Car 클래스 선언
}
클래스의 용도는 다음과 같습니다
- 실행용 : 프로그램 전체에서 단 하나의 클래스로, 프로그램의 실행을 전적으로 맡고 있습니다. 프로그램의 시작 메서드인 main()을 가지고 있는 클래스를 말하며, 다른 클래스에서 사용하지 않습니다.
- 라이브러리용 : 다른 클래스에서 이용할 목적으로 선언되는 클래스입니다.
하나의 클래스가 위 두 가지 용도의 역할을 모두 수행할 수도 있지만 유지보수와 객체 지향 프로그래밍의 특징인
모듈화를 고려해 별도로 분리하여 작성하는 것이 좋습니다. 따라서 일반적으로 하나의 프로그램에서 실행용 클래스
1개를 제외한 나머지 클래스는 모두 라이브러리용 클래스입니다.
클래스를 선언하는 방법은 다음과 같습니다.
접근 제한자 class 클래스이름 {
}
- 접근 제한자 : 변수와 마찬가지로 클래스의 접근 범위를 제한합니다.
- class : class를 선언함을 뜻합니다.
- 클래스 이름 : 변수처럼 이름을 가지고, 객체를 생성할 때 사용합니다.
객체를 담을 수 있는 변수 선언
클래스면 객체명;
클래스는 마치 변수의 자료형처럼, '클래스명'의 데이터를 담을 수 있는
'객체명' 이라는 이름을 가진 변수를 선언하는 것과 형태가 비슷합니다.
객체를 생성하고 대입하는 형태는 다음과 같습니다.
객체명 = new 클래스명();
객체를 생성하는 키워드는 'new'입니다. 클래스을 이용해 객체를 생성할 수 있도록 도와줍니다.
파일의 이름과 동일한 클래스만 public을 사용하고, 다른 클래스는 public을 제외한다면 2개 이상의 클래스를
하나의 소스파일에 작성할 수 있습니다.
코드를 컴파일한 결과물은 코드 파일을 각각 작성한 것과 동일하게 각 class별로 도출되어 2개가 생성됩니다.
파일 분리 여부와 상관없이 결과물이 같기 때문에, 분리 여부는 개발자가 원하는 대로 작성해도 무방합니다.
그러나 추후 유지 보수의 편리성과 클래스 재사용을 고려해 하나의 파일에 한 개의 클래스를 작성하는 것이 좋습니다.
3. 클래스의 구성
클래스 의 구성
클래스를 바탕으로 생성된 객체가 가져야할 특징과 요소들로 구성됩니다.
- 필드(field)
- 메서드(method)
- 생성자(constructor)
각 용서들은 필요에 따라 생략하거나 2개 이상 작성할 수 있습니다.
필드(Field)
필드는 객체가 가져야할 데이터 상태를 저장하는 변수를 말합니다. 클래스 내에 정의되고 객체가 생성될 때
그 객체와 함께 존재하는 데이터입니다.
public class Car{
int wheel; //필드 선언
}
public class Car{
int whell = 4; // 필드 선언 및 초기화
} // 필드 선언과 초기화를 나눠서 작성할 수 있습니다.
클래스를 선언할 때 필드의 값을 초기화 하지 않았으면 객체 생성 시 자동으로 기본값으로 초기화됩니다.
필드의 사용
변수와 마찬가지로 필드의 값을 읽거나 변경할 수 있습니다.
클래스 안에 선언된 변수이기 때문에, 클래스 안에서는 기존에 변수를 사용했던 것처럼 사용할 수 있습니다.
필드는 클래스에 포함된 요소이자 객체를 생성한 후 객체가 가지는 데이터이기도 합니다. 따라서 객체를 생성한 후
그 객체의필드를 사용할 수 있습니다.
객체의 데이터, 즉 필드에 접근하는 방법은 다음과 같습니다.
객체명.필드명
- 객체명 : 클래스를 이용해 만든 객체 이름
- 만든 객체가 가지고 있는 필드 이름
메서드(method)
메서드란 객체의 기능을 담당하는 중괄호{ } 블록을 말합니다.
특정 기능을 수행하는 코드를 따로 빼서 중괄호 안에 작성하며, 1개의 메서드는 일반적으로 1개의 기능을 수행합니다.
메서드 선언은 다음과 같습니다.
반환 타입 메서드명(){
// 기능을 수행할 코드 작성
}
메서드를 호출하면 블록 안에 있는 코드들이 위에서부터 순차적으로 모두 수행되고 경우에 따라 실행한 결과를
호출한 곳으로 다시 돌려주기도 합니다. 이 것을 '반환'이라고 표현하며 반환하는 결과값을 '리턴값'이라고도 부릅니다.
리턴값이 있을 경우에는 리턴할 데이터의 형태가 무엇인지 메서드명() 앞에 타입으로 기재해 주어야 합니다.
- 리턴값이 있을 경우 : 리턴값의 자료형을 반환 타입으로 작성합니다.
- 리턴값이 없을 경우 : 반환 타입을 void라고 작성합니다
메서드 사용
구현한 메서드를 사용하는 방법은, 필드의 사용법과 동일합니다.
메서드를 선언할 클래스 안에서 메서드를 사용할 때는 단순히 메서드명만 호출하면 되지만, 다른 클래스에서
메서드를 사용하려면 객체를 먼저 생성한 후 참조 변수를 이용해 그 객체를 먼저 생성한 후 참조 변수를 이용해
그 객체의 메서드를 사용해야 합니다. 객체가 존재해야 메서드도 존재하기 때문입니다.
객체의 메서드에 접근하는 방법은 다음과 같습니다.
클래스명 객체명 = 클래스명(); //객체 생성
객체명.메서드명(); // 생성한 객체의 메서드 호출(사용)
메서드를 한 번 선언해 두면 필요할 때마다 여러 번 호출하여 사용할 수 있습니다.
즉, 메서드를 사용하면 반복적인 프로그래밍을 보다 쉽고 간단하게 해결할 수 있습니다.
- 메서드 이름은 그 메서드의 기능을 명확하게 설명해 줄 수 있게 작성하는 것이 좋습니다.
- 메서드 이름을 작성하는 규칙 역시 변수를 작성하는 규칙과 동일하며, 한글도 사용할 수 있습니다.
- 클래스명과는 달리 최근 실무에서 테스트를 위한 메서드의 이름을 한글로 작성하기도 합니다. 개발자 본인 혼자 확인하기 위한 테스트의 경우 많이 사용하고 있는 추세지만 아무리 테스트용 코드일지라도, 다른 개발자와 공용으로 사용하는 코드에서 한글 이름을 사용하는 것은 협의가 필요합니다.
생성자(constructor)
메서드 중에서 객체를 생성할 때 반드시 호출해야 하는 메서드가 있습니다.
이 메서드는 객체를 생성하면서 객체 변수를 초기화하는 역할을 하는데, 이를 생성자라고 부릅니다.
클래스명 객체명 = new 클래스명();
생성자라는 메서드는 클래스명과 이름이 같습니다. 그런데 이상한 점이 있습니다. 우리는 이런 메서드를 생성한 적이
없음에도 생성자를 호출하여 객체를 생성해왔습니다. 그 이유는 우리가 직접 선언하지 않아도 기본 생성자가
자동으로 생성됩니다.
생성자를 통해 객체 변수를 초기화한다는 것은, 단순히 어떠한 값을 초기화한다는 뜻이 아닙니다. 필드와 메서드를
호출하는 등 객체를 사용하기 위해서는 객체 변수가 메모리에 올라가야 하는데, 이렇게 메모리에 객체 변수를
올려주는 역할을 생성자가 해줍니다.
4. 정적 멤버와 static
인스턴스 멤버와 정적 멤버
클래스 안에 선언된 필드와 메서드를 클래스 멤버라고도 부릅니다. 클래스에 포함된 요소라는 의미로
'멤버'라는 용어를 사용합니다.
모든 객체가 같은 필드 값을 가지게 할 수도 있습니다. 일반적으로 각 객체가 가지게 되는 필드와 메서드를
인스턴스(객체) 멤버라고도 말하며 모든 객체들이 고융하며 사용하는 하나의 필드와 메서드를 정적 멤버라고 부릅니다.
정적 멤버
정적 멤버란, 필드와 메서드를 선언할 때 static이라는 키워드가 붙은 멤버들을 말합니다.
static
프로그래밍 언어에서 static은 이러한 의미를 바탕으로 '클래스에 고정되었다'라는 의미로 사용되고 있습니다.
쉽게 말해 객체가 아닌 클래스의 의존적인 요소라고 생각할 수 있습니다.
static이 앞에 붙은 멤버들은 다른 멤버들과 달리 객체를 생성하지 않고 바로 사용할 수 있습니다.
그 이유는 객체를 생성할 때 메모리에 올라가는 것이 아니라, 프로그램을 시작할 때 메모리에 올라가고
프로그램이 종료될 때 메모리에서 사라지기 때문입니다.
메서드 안에 지역변수는 static으로 선언할 수 없습니다.
호출 방법은 다음과 같이 클래스 이름을 통해 호출합니다.
클래스명.필드;
클래스명.메서드();
정적 멤버의 경우, 객체마다 가지는 데이터 기능이 아니기 때문에 모든 객체가 같은 값을 가져야 할 경우에 사용하는
것이 효율적입니다. 따라서 각 클래스의 멤버를 선언할 때는 충분히 고려한 후 정적 멤버로 선언할지에 대한 결정을 내리는 것이 좋습니다.
정적 멤버를 호출할 때, 아래와 같이 객체 변수로 호출할 수도 있습니다.
Student stu1 = new Student();
System.out.println(stu1.schoolName);
그러나 클래스명으로 접근하는 것이 자바 세상의 원칙이기 때문에 정적 멤버는 클래스명으로 접근하는 것을
추천합니다. 또한 일부 개발 툴에서는 객체 변수를 통해 호출하면 경고문을 발생시키기도 합니다.
응용문제
1. 다음 문장이 맞으면 O표, 틀리면X표 하세요
객체를 중심으로 프로그램 구조를 설계하고 프로그래밍하는 것을 객체 지향 프로그램이라고 합니다. ( )
하나의 클래스로 하나의 객체만 만들 수 있습니다. ( )
정답 : O X
2. 다음 중 객체가 될 수 있는 것을 모두 고르세요
①학생 ②수영장 ③꽃 ④나이
정답 : ①,②,③
3. 다음 빈칸에 알맞은 단어를 작성해 보세요
- 클래스의 3요소는 ㅁㅁ,ㅁㅁㅁ,ㅁㅁㅁ 입니다
- 클래스를 선언할 때 ㅁㅁㅁ(을)를 이용해 접근 범위를 설정할 수 있습니다.
- 클래스는 크게 ㅁㅁ클래스, ㅁㅁ클래스로 분류할 수 있습니다.
정답 : 멤버 클래스, 로컬 클래스
4. 다음 코드는 컴파일 에러가 발생합니다. 그 이유는 무엇이며, 어떻게 해결해야 할까요 ?
package section07;
public class PRACTICE_07_04{
public static void main(String[] args){
Speaker speaker = new Speaker();
speaker.turnOn();
}
}
class Speaker{
void turnOn(){
static int volume = 50;
System.out.println("스피커의 전원이 켜졌습니다. 기본 볼륨은 " + vloume +" 입니다.);
}
}
메서드 안에 있는 변수에는 static을 사용 할 수 없음
class Speaker{
void turnOn() {
int volume = 50;
System.out.println(volume);
}
}
'javaboiii의 JAVA > JAVA 요약정리(멘토씨리즈)' 카테고리의 다른 글
JAVA -9)생성자 (2) | 2024.07.20 |
---|---|
JAVA -8) 메서드(Method) (0) | 2024.07.19 |
JAVA -6)배열 (0) | 2024.07.17 |
JAVA - 5)제어문2 (1) | 2024.07.16 |
JAVA -4) 제어문1 (1) | 2024.07.15 |