생성자 : 리턴 값이 없다. / 생성자는 해당 class와 이름이 동일하다.
래와 같이 인스턴스가 생성될 때 left, right의 값을 입력하도록 강제한다면 어떨까?
아래와 같은 내용이 추가 되었다. 이것이 바로 생성자이다.
public Calculator(int left, int right) {
this.left = left;
this.right = right;
}
생성자는 그 이름처럼 객체를 생성할 때 호출된다 아래는 위의 생성자를 이용해서 객체를 생성하는 방법을 보여준다.
1
Calculator c1 = new Calculator(10, 20);
생성자 덕분에 Calculator 객체를 사용하기 위해서 사실상 반드시 필요한 작업이라고 할 수 있는 좌항(left)과 우항(right)의 값을 설정하는 과정을 객체 생성 과정에서 강제할 수 있게 되었다. 절차를 하나 줄인 것뿐이지만, 객체를 사용하기 위해서는 객체를 생성해야 한다는 사실은 기본적으로 숙지하고 있는 절차이기 때문에 이 절차에 필수적인 작업을 포함시킨다는 것은 중요한 의미를 갖게 된다.
클래스, 객체, 인스턴스의 개념을 잘 이해를 해야 올바르다고 할 수 있는 객체지향적인 프로그래밍을 할 수 있다고 생각한다.
클래스, 객체, 인스턴스의 개념
개념
서로 관련 되어 있는 메서드의 집합
객체들의 속성을 묶어 놓은 집합체
개념
것이라 생각한다.
객체는 속성과 동작으로 이루어져 있다.
특징
개념
클래스로부터 생성된 객체를 인스턴스라 생각하면 쉬울것이다.
특징
클래스와 인스턴스는 같은 의미이기에 이 둘을 문맥에 따라 구별하는 것
이 맞다.
ex) 책상은 객체이다, 책상은 책상 클래스의 인스턴스이다.
클래스 예제
앞서 말한것처럼 클래스는 객체를 만들기위한 설계도이다.
객체는 속성과 기능 이 두가지의 구성요소로 이루어져 있는데
속성을 멤버변수, 기능을 메서드(함수)라고 자주 부른다.
public class Student {
//멤버 변수
String name;
int number;
int grade;
// 메서드(함수)
public void getGrade() {
grade += 10;
}
public static void main(String[] args) {
Student student1 = new Student(); // 객체를 생성할때는 new 연산자를 통해 생성한다.
// Student()는 생성자를 호출한다는 의미이다.(생성자는 좀 이따 설명)
student1.name = "영희";
student1.number = 1;
student1.grade = 80;
System.out.println("학생의 이름은 " + student1.name);
System.out.println("학생의 번호는 " + student1.number);
System.out.println("학생의 성적은 " + student1.grade);
student1.getGrade();
System.out.println("학생의 성적은 " + student1.grade);
}
}
실행결과
학생의 이름은 영희
학생의 번호는 1
학생의 성적은 80
학생의 성적은 90
저런식으로 코드를 작성할 시 문제점이 무엇일까?
바로 귀찮다는 것이다. 일일이 객체의 속성을 지정해서 출력을 해주는 일은 귀찮을 뿐더러
보기에도 이쁘지가 않다.
그래서 클래스에는 생성자(Constructor)라는 것이 있다.
생성자(Constructor)
생성자는 new 연산자를 통해 객체를 생성할 때 반드시 호출이 되고 제일 먼저 실행되는 일종의 메서드라고 생각하면 편하다.(메서드와 비슷하지 그 의미가 같은 것은 아니다) 생성자는 멤버 변수를 초기화하는 역할을 한다.
생성자 선언 방법
생성자는 위 그림과 같이 선언 하는데 파란 글씨는 굳이 적지 않아도 되고 빨간 부분만 반드시 적어야한다.
그리고 생성자는 리턴 값이 없다.
즉 생성자는 다음과 같이 선언할 수 있다.
class Student {
Student() {} // 매개변수가 없는 생성자
Studnet(String name, int number){} // 매개변수가 있는 생성자
}
그런데 아까 우리가 작성한 예제 코드에서는 생성자를 선언하지 않았는데 객체가 잘 생성되었다.
그 이유가 무엇일까?
그것은 생성자를 선언하지 않으면 컴파일러에서 자동으로 기본 생성자(Default Constructor)를 생성해주기 때문이다. 기본 생성자는
public Class() {}
다음과 같은 형태가 기본 생성자이다. 기본 생성자는 생성자가 하나도 없을 경우 생성해 주기 때문에 이에 유의하면서 코드를 작성해야 한다.
예제를 통해 생성자에 대해 살펴보자.
public Student() {
name = "학생";
number = 100;
grade = 0;
System.out.println("학생의 이름은 " + name);
System.out.println("학생의 번호는 " + number);
System.out.println("학생의 성적은 " + grade);
}
public static void main(String[] args) {
Student student1 = new Student();
}
방금 작성한 코드를 다음과 같이 조금 고쳐보자
그러면 실행 결과가 다음과 같이 나올 것이다.
실행결과
학생의 이름은 학생
학생의 번호는 100
학생의 성적은 0
조금 감이 잡힐 것이다. 그렇다면 이제 매개변수를 받는 생성자를 만들어서 우리가 원하는 학생 객체를 만들어 보자.
번호가 1이고 성적은 50인 영희학생과 번호가2이고 성적은 40인 철수학생을 매개변수를 받는 생성자를 이용해 만들어보자
public Student(String studentName, int studentNumber, int studentGrade) {
name = studentName;
grade = studentNumber;
number = studentGrade;
System.out.println("학생의 이름은 " + name);
System.out.println("학생의 번호는 " + number);
System.out.println("학생의 성적은 " + grade);
}
public static void main(String[] args) {
Student student1 = new Student("영희", 1, 50);
Student student2 = new Student("철수", 2, 40);
}
adapter는 ListView (또는 다른 형태의 ViewGroup) 와 실제 데이터(List, Array 등)의 중간 역할을 하는 추상 인터페이스 입니다.
ListView에서는 실제 데이터가 어떤 형태인지 어떤 데이터들을 가지고 있는지 상관하지 않고 adapter가 주는 view만 목록으로 나열하게끔 되어 있고, 실제 데이터 역시 어떻게 표현할지 관심 가지지 않고, adapter에서 원하는대로 데이터만 주면 되도록 서로 분리시키는 것입니다.
adapter가 할 일은 실제 데이터 관리를 하고 ListView가 '보여질 목록하나 만들어줘라(getView)' 할때 실제 데이터에서 view를 만들어서 주는 역할입니다.
inflater는 xml로 정의된 view (또는 menu 등)를 실제 객체화 시키는 용도입니다.
예를 들어 약간 복잡한 구조의 view를 java코드로 만들게 되면 생성하고 속성 넣어주느라 코드가 길어질 수 있는데,
그걸 미리 xml로 만들어 놓고 java코드에서는 inflater를 활용하여 바로 view를 생성할 수 있습니다.
해당 java 코드 파일에서 우클릭 -> generate -> getter,setter
Context 는 크게 두 가지 역할을 수행하는 Abstract 클래스 입니다.
1 어플리케이션에 관하여 시스템이 관리하고 있는 정보에 접근하기
2 안드로이드 시스템 서비스에서 제공하는 API 를 호출 할 수 있는 기능
Context 는 어플리케이션과 관련된 정보에 접근하고자 하거나 어플리케이션과 연관된 시스템 레벨의 함수를 호출하고자 할 때 사용됩니다.
그런데 안드로이드 시스템에서 어플리케이션 정보를 관리하고 있는 것은 시스템이 아닌, ActivityManagerService 라는 일종의 또 다른 어플리케이션입니다. 따라서 다른 일반적은 플랫폼과는 달리, 안드로이드에서는 어플리케이션과 관련된 정보에 접근하고자 할때는 ActivityManagerService 를 통해야만 합니다. 당연히 정보를 얻고자 하는 어플리케이션이 어떤 어플리케이션인지에 관한 키 값도 필요해집니다.
즉, 안드로이드 플랫폼상에서의 관점으로 샆펴보면, Context 는 다음과 같은두 가지 역할을 수행하기 때문에 꼭 필요한 존재입니다.
ArrayList
-ex)
ArrayList a = new ArrayList();
a.add(new Aaa()); //Class를 새로 생성해서 추가
a.add(new Aaa(1,2)); //Class가 파라미터를 받은 경우
int n = a.size(); //ArrayList에 저장된 요소의 개수
a.get(index); //해당 인덱스 위치의 요소 찾기
a.remove(index); //해당 인덱스 위치의 요소 삭제
a.clear(); //모든 데이터를 삭제하고 ArrayList 초기화