목차
자료 구조(Data Structure)
처리될 데이터와 저장 주소 사이의 관계
데이터를 어떤 순서로 기억시키고 접근할 지 결정
- 선형 구조 : 배열, Linked List, Queue, Stack등
- 비선형 구조: Tree, Graph등
파일 구조
처리될 데이터와 디스크의 저장 주소 사이의 관계
데이터베이스
여러 응용 목적을 가지는 데이터를 체계적으로 저장
다수의 사용자가 자료를 공유
보안과 안정성 보장
객체지향
객체
소프트웨어 세계에 구현할 대상
객체마다 고유의 특성과 행동을 가짐
다른 객체들과 정보를 주고받는 중 상호작용하며 살아감
Class
객체를 정의하는 틀
Data를 관련된 코드(동작)과 함께 묶음
객체를 구성하는 유사한 동작들을 하나로 묶음
-
Class와 인스턴스 (Instance) 인스턴스_ 클래스에 정의된 틀에 따라 실제 메모리에 생성되는 객체
문제
1) (Circle) 클래스를 선언해 보자
이 클래스에선 원의 넓이를 계산해야 한다
이 클래스에선 원의 둘레를 계산해야 한다
2) 함수사용 클래스 (CircleUse)을 선언해보자
이 클래스에선 circle를 선언한 함수 구현
1) 클래스 생성
- 함수의 계산을 도맡는 함수인 (Circle)
- 함수를 사용하는 클래스인 (CircleUse)
이 과정을 두번 반복하여 class를 2개 만들어줌(Circle),(CircleUse)
2) circle 명령 짜기(동적 할당 공간 이용)
package hihi;
public class Circle {
double r;
double pi = 3.14;
// 둘레
double round() {
double rr = 2*r*pi;
return rr;
}
// 길이
double area() {
return r*r*pi;
}
}
3) circleuse 함수에서 circle 함수 이용할 수 있게 하기
상호작용 할 수 있게
package hihi;
import java.util.Scanner;
public class CircleUse {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scan = new Scanner(System.in);
// Circle 클래스로 생성한 인스턴스 안의 변수 r을 사용할 함수 입력받기
// 지름을 받음
int rr = scan.nextInt();
// 클래스 불러내어 만들어 내기
// circle클래스를 use라고 쓰는 것 (붕어빵 틀에서 나온 붕어빵)
// 즉 circle클래스를 use라는 이름으로 쓰겠다
Circle use = new Circle();
// circle클래스의 r정의
// use가 위에서 만든 인스턴스
// 클래스에서 인스턴스를 생성해야 동작
// 지름(rr)을 받았으니 2를 나눠 반지름으로 바꿔주는 것
use.r = rr/2;
// circle클래스의 area함수를 쓰는 것
// 길이를 정의한 함수 모르겠으면 위의 circle클래스에서 확인해봐
double size = use.area();
System.out.println(size);
scan.close();
}
}
위의 두 클래스는 eclipes에서 이렇게 구현 된다
생성자
필요한 이유
[Q]
그런데 만약 circleuse 함수에서 인스턴스 변수인 r을 정의를 안하고 실행한다면?
package hihi;
import java.util.Scanner;
public class CircleUse {
public static void main(String[] args) {
// TODO Auto-generated method stub
//Scanner scan = new Scanner(System.in);
//int rr = scan.nextInt();
Circle use = new Circle();
//use.r = rr/2;
double size = use.area();
System.out.println(size);
scan.close();
}
}
[A]
오류가 난다.
[solve]
그러므로 이 클래스를 시작하면 반드시 실행되어야 하는(아이에 r값을 디폴트해주는) 기능을 추가하자
인스턴스가 실행되자마자 기본적으로 생성되는 [ex_ 아이에 r값을 디폴트해주는 기능을 추가] 것을 생성자라고 함
생성자 정의
- 객체가 생성될 때 초기화 목적으로 실행되는 함수
- 객체가 생성되는 순간에 자동 호출
- 생성자는 클래스 이름과 동일
- 생성자는 여러 개 작성 가능(중복해서 작성 가능)
하지만 입력인자에 따라서 한번만 실행 - RETURN 타입 없어야함(VOID OR 생략)
- 생성자가 없으면 컴퓨터가 자동으로 몰래 만들어냄
(하지만 아무 코드도 없음) - 생성자는 객체 생성시 한번만 호출
Circle use = new Circle();
이때 한번만 호출됨
[구현]
package hihi;
public class Circle {
double r;
double pi = 3.14;
// 이게 생성자
// 생성자는 클래스 이름과 같음
// 이 클래스가 시작되면 자동으로 시작
// 리턴 타입도 없음
Circle(){
r=10;
}
double round() {
double rr = 2*r*pi;
return rr;
}
double area() {
return r*r*pi;
}
}
이렇게 구현을 해두면 r값을 정의를 해주는 use.r = rr/2;
가 없어도 디폴트 값이 자동으로 생성되기 때문에 오류가 나지 않는다.
접근 권한 설정
만약 사용자가 건들이면 안되는 함수들이 있다(건들면 컴퓨터가 안되거나)면??
이러한 함수들에 main함수가 접근 가능 여부를 정해줘야함
ex) 여기서 CircleUse에서 CIrcle 인스턴트 생성 후 파이 값을 r처럼 재정의하면 위험하겠죠?
클래스나 일부 멤버 함수, 변수등을 공개하여 다른 클래스에서 접근하도록 허용
- public : 모든 클래스에 허용
- protected: 동일 패키지와 자식 클래스에 허용
- private : 외부로부터 완벽 차단
[구현]
public class Circle {
// r은 바꿀 수 있음
public double r;
//pi는 못바꿈
private double pi = 3.14;
Circle(){
r=10;
}
double round() {
double rr = 2*r*pi;
return rr;
}
double area() {
return r*r*pi;
}
}
이렇게 설정해두면 CircleUse함수에서(코드 안에서 설명 계속)
package hihi;
import java.util.Scanner;
public class CircleUse {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scan = new Scanner(System.in);
int rr = scan.nextInt();
Circle use = new Circle();
// public이므로 잘 동작
use.r = rr/2;
// private을 바꾸려 하므로 에러
use.pi = 1;
double size = use.area();
System.out.println(size);
scan.close();
}
}
감춘 것 쓸려고 하면 에러남