프로그램에서 표현하고자 하는 기능을 묶기 위한 단위
(설계적인 측면)
객체가 중심이 되는 프로그래밍 기법
객체 지향, 함수 지향 등등 궁금한게 많아 따로 찾아보았다
요약아닌 요약이라면 절차지향에서 파생되어 객체지향이 만들어지고, 함수형이 작은 덩어리로 작동한다면, 그 덩어리를 큰 object(객체)로 묶어서 작동 시키는것 같다.
참고링크
데이터는 변수로 표현된다.
객체안에 포함된 변수를 멤버변수 혹은 프로퍼티라고 한다.
기능은 메서드(=함수)로 표현이 된다.
객체를 생성하기 위해서는 객체의 설계도가 필요하다.
객체의 설계도 역할을 하는 프로그램 소스
공장에서 하나의 설계도를 사용하여 여러개의 제품을 생산할 수 있는 것처럼 하나의 클래스를 통해 동일한 구조를 갖는 객체를 여러개 생성할 수 있다.
동일한 설계로 만들어진 자동차라 할지라도, 각각의 자동차를 구성하는 부품들은 그 형태만 같을 뿐, 실제로는 각각 존재하게 된다.
클래스를 작성하면서 그 안에 생성되는 멤버변수들은 여러 개의 객체간의 서로 동일한 이름으로 존재하지만 실제로는 서로 다른 값이라는 의미
좀 더 풀어보자면, 뼈대를 두고 같은 방식으로 움직이나 결과값이 다르게 나오는걸 만드는것 같다.
class 클래스 이름{
멤버 변수;
void 메서드이름(){
}
void 메서드이름(){
}
}
'class'라는 예약어와 클래스의 이름을 명시하고{...} 블록으로 구성한다.
멤버변수는 여러개 존재할 수 있다. 이 때, 값을 선언과 동시에 할당할 수 있고, 객체를 통해 간접적으로 할당할 수도 있다.
메서드는 여러개 존재할 수 있다.
클래스 안에 포함된 멤버변수와 메서드를 특성에 따라 그룹화하기 위한 기법이 클래스를 작성하는 것이라고 이해할 수 있다.
클래스이름 객체이름;
객체이름 = new 클래스 이름();
클래스이름 객체이름 = new 클래스 이름();
ex) Car bus = new Car();
객체 안에 포함된 변수나 메서드는 점(.)으로 연결하여 접근한다.
ex)
- 객체이름.멤버변수 = 값;
- 객체이름.메서드이름();
- 객체이름.메서드이름(값1, 값2, ...);
객체를 생성함과 동시에 객체안에 name변수와 age변수가 할당된 값을포함하게된다.
같은 클래스로 객체를 여러 개 생성할 경우, 모든 객체가 동일한 값을 갖게된다.
멤버변수의 값을 지정하기 전까지 사용될 "기본값"으로서의 의미이다
일반적으로 클래스 작성시에는 멤버변수에 값을 지정하지 않는다.
여기서 코멘트를 달아보자면, 멤버변수 즉 상위(class)에 변수 지정 하면, 하위(method)들은 여기에 영향을 미친다고 보면 될거같다.
메서드란 프로그램에서 하나의 동작 단위를 의미한다.
두 개 이상의 메서드가 서로 동일한 대상을 위해서 존재 할 경우, 이 메서드를 클래스에 포함시켜 그룹화 시킬 수 있다.
클래스에 멤버변수와 메서드가 공존할 경우, 멤버변수는 모든 메서드가 공유하는 전역 변수로 존재하게 된다.
클래스안에서 선언된 변수로서, 클래스 블록 범위 안에서 유효하다.
메서드 안에서 선언된 변수로서, 메서드의 블록을
빠져가나가지 못한다. 그러므로 다른 메서드는 해당 변수를 인식하지
못한다.
이 규칙은 조건, 반복문과 같은 블록 {}을 형성하는 모든
경우에 해당한다.
객체 안에 멤버변수(=데이터)가 포함되지 않는다.
객체 안에 포함된 메서드를 호출하여 결과를 만들기 위한 목적이므로
굳이 여러개의 객체를 생성할 필요가 없다.
자기 자신을 의미하는 키워드, 클래스 안에서 this를 사용하여 "자기자신을"표현한다.
메소드안에 값을 지역변수로 일회성으로 쓰지않고 멤버변수에 지정할때 쓰는것같다.
class User{
String name;
public void setName(){
String name;
name = "자바학생";
}
}
멤버변수와 지역변수가 동일한 이름으로 공존할 경우, 유효성의 범위가 작은 변수가 우선적으로 인식된다.
class User{
String name;
public void setName(){
String name;
name = "자바학생"; // void 메서드 안에 지역변수에 자바학생 저장
this.name ="자바"; // 클래스안에 멤버변수에 자바저장
// 현재 클래스의 자신의 변수
// 즉, 멤버변수로 선언된 name을 의미한다.
}
}
위, 아래 둘 다 결과 값은 같으나, this가 좀 더 직관성이 뚜렷하다.
파라미터도 해당 메서드 안에서만 유효한 지역변수의 일종이다.
파라미터를 사용하여 멤버변수의 값을 간접적으로 설정하고자 할 경우, 변수의 이름을 서로 다르게 사용하는 것 보다는 이름은 동일하게 지정하고 this 키워드를 사용하여 멤버변수와 파라미터를 구별하는 것이 java언어의 일반적인 처리 방식이다.
class User{
String name;
Public void setName(String name){
this.name = name; //지역변수 name을 멤버변수인 this.name(구분하기 위하여 this사용)에 저장
}
}
------------------------------------------------
User u = new User(); //class선언
u.setName("자바학생"); //클래스 안 메소드 호출, 자바학생 저장
System.out.println(u.name); // 자바학생 출력
------------------------------------------------
모든 멤버변수 앞에는 this 키워드를 사용하여 멤버변수임을 직관적으로
표시하는 것이 소스코드의 가독성을 위하여 바람직하다.
class User{
Public String getName(){
String name = "자바학생";
return name;
}
Public String sayName(){
String myname = this.getName(); // 사실 메서드다보니 의미가없다.
System.out.println(myname);
}
}
메서드의 경우 다른 클래스의 메서드를 이름만으로 호출할 수 있는 방법이
없기 때문에, this.getName()이 아닌, getName()만 사용하더라도 가독성에 문제는 없다
영어 + 숫자 + 언더바(_)의 조합이고, 첫 글자는 반드시 영어로 표기한다.
첫 글자는 대문자로 시작, 나머지 글자는 소문자로 표시한다.
두 개 이상의 단어를 조합해야 할 경우 새로운 단어는 대문자로 시작한다.
class MyClass
class Student
class NetworkHelper
대부분 소문자로 구성되지만, 두 개 이상의 단어를 조합할 경우 새로운 단어는 대문자로 표시한다.
모두 대문자로 표시한다.
final double PI;
final int COLOR;
new 키워드를 사용하여 객체가 생성될 때 자동으로 실행되는 특수한 형태의 메서드
return형을 명시하지 않으며, 메서드의 이름은 클래스와 동일하다.
Member member = new Member(); <-여기서 우항의 Member()는 메서드형태
class Member{
Member(){
//이 안에는 객체가 생성될 때 자동으로 호출된다.
}
.....
}
자동으로 실행된다는 특성 때문에, 객체가 생성되면서 해당 객체의 특성을 초기화 하기 위하여 사용된다.
(ex : 멤버변수의 초기값을 할당하는 용도)
파라미터가 없는 생성자
클래스에 특별히 생성자가 정의되지 않은 경우Java컴파일러는 다음과 같은 기본생성자가 존재한다고 인식한다.
class User{
User(){
//생성자가 있지만, 내용이 비어있다.
}
}
생성자도 메서드의 한 종류이므로 파라미터를 함께 정의하는 것이 가능하다.
생성자의 파라미터를 멤버변수에 복사하는 것으로 객체의 초기화를 외부적인 요인에 의해 처리할 수 있다.
class Student{
String name;
int age;
Student(String name, int age){
// 생성자 파라미터의 값을 멤버변수에 복사
this.name = name;
this.age = age;
}
}
-----------------------------------------------------------
// 생성자에 파라미터를 선언하였기 때문에 클래스 호출 할때도 반드시
메서드 부분에 파라미터를 넣어줘야한다. 그렇지 않으면 생성자호출이안됨
Student std = new Student("자바학생",20);
멤버변수나 메서드가 객체에 노출되지 않도록 설정하는 기법
객체를 사용하는 측의 실수로 인한 기능의 오작동을 방지하기 위해, 클래스의 일부를 숨기는 처리를 말한다.
변수의 이름이나 메서드의 이름앞에 "접근 한정자"를 지정한다.
모든 곳에서 접근 가능하다.
일반적으로 모든 메서드 앞에 명시한다.
클래스 안에서만 사용가능하고, 객체를 통해 접근할 수 없다.
일반적으로 모든 멤버변수 앞에 명시한다.
현재 클래스내의 다른자원이나, 같은 패키지 안에 존재하는 클래스와 하위 클래스에서 접근 가능하다.(잘 사용하지 않는다)
접근 한정자를 명시하지 않는 경우, 현재 클래스 내의 다른 자원이나 동일 패키지내의 다른 클래스에서 접근 가능하다.
멤버변수가 은닉된 형태로 선언된 경우 프로그램의 가장 근본적인 목적인 데이터에 접근하는 방법이 사라지므로, 메서드를 통하여 간접적으로 접근하는 방법이 마련되어야 한다.
getter, setter는 은닉된 멤버변수에 간접적으로 접근하기 위하여 정의된 메서드들을 의미하는 용어.
getter : 은닉된 멤버변수의 값을 리턴하기위한 메서드
setter : 파라미터로 전달된 변수를 멤버변수에 복사하기위한 메서드
getter setter
String userName String getUserName() void setUserName(String userName)
int userAge int getUserAge() void setUserAge(int userAge)
get,set 접두사 뒤에 변수이름을 첫 글자가 대문자인 형태로 명시
getter는 연결된 멤버변수의 데이터 타입을 리턴형으로 명시
setter는 연결딘 멤버변수의 데이터 타입을 파라미터형으로 명시
클래스에 접근 한정자를 지정한 경우
public
객체 생성 가능하다.
서로 다른 소스코드에 정의된 클래스 끼리도 객체 생성이 가능하다.
private
클래스에 적용할 수 없다.
protected
클래스에 적용할 수 없다.
default
동일한 소스코드에 정의된 클래스끼리만 객체로 생성 가능하다.
(지금까지의 예제 형태, 암묵적으로 default가 있었다.)
하나의 소스코드에서 프로그램의 모든 기능을 구현하게 되면 유지보수에 비효율적이므로, 기능단위로 소스코드를 분리해야 한다.
소스코드가 분리된 클래스 끼리는 public이 명시되어야만 서로 객체 생성이 가능하다.
일반적으로 클래스 정의에는 public 접근 한정자만 사용한다.
하나의 소스코드에는 하나의 public 클래스만 존재할 수 있다.
이때문에 자바가 객체지향언어라고 불리는것이라 한다.
접근 제한자는 객체지향의 캡슐화, 그리고 그를 통한 코드 은닉화를 위한 도구이다.
데이터를 외부로부터 숨기거나, 접근을 막고, 또는 접근에 처리를 강제화 한다.
더 관리하기 쉽고 코드를 명확히 하기위함
정보를 외부에 은닉하여 외부에서는 해당 집합의 세부 내용에 집중하지 않도록 함
외부에서 멤버를 엑세스하는 방법을 지정할 수 있도록, 직접 접근을 막거나 접근전 부가적인 처리를 요구함
자바 언어에서 사용하는 복합적 데이터 표현의 최소 단위로서, 재사용 가능한 컴포넌트를 생성할 수 있다.
자바빈즈 클래스로서 작동하기 위해서는, 객체 클래스는 명명법, 생성법, 그리도 행동에 관련된 일련의 관례를 따라야만 한다.
생성자를 가지고 있어야한다.
클래스의 속성들은 get,set 혹은 표준 명명법을 따르는 메서드들을 사용해 접근할 수 있어야 한다.