자바는 객체 지향 프로그래밍 : 각각의 컴퓨터 부품을 만들고 그 부품들을 조립하여 컴퓨터를 만들 듯이 객체를 만들고 그 객체들을
조립하여 소프트웨어를 만드는 기법이다.
<특징>
-캡슐화 (encapsuation) : 관련된 데이터와 알고리즘(코드)이 하나의 묶음으로 정리
-상속 : 이미 작성된 클래스(부모 클래스)를 이어 받아 새로운 클래스(자식 클래스)를 생성하며, 기존의 코드를 재사용할 수 있는 강력한 기법
-객체(Object) : 객체 지향 기술의 핵심 , 객체 안의 변수를 필드(field)라 부르고, 객체 안의 함수를 메소드(method)라 부른다
하나의 객체는 필드와 메소드로 이루어진 SW묶음
-메세지(Message) : 객체는 메세지를 통해 다른 객체와 통신하고 상호 작용 / 매개변수(parameter)의 형태로 전달
Car.setSpeed(100);
Car : 메세지를 받는 객체
setSpeed : 매세지의 이름
(100) : 메세지의 매개변수
1.클래스(Class)
: 특정한 기능을 가진 객체를 생성하게 해주는 설계도
-클래스로 부터 만들어진 객체 : 해당 클래스의 인스턴스(instance)
#예시
-자바에서는 일반적으로 하나의 소스 파일에는 하나의 클래스만을 담는 것이 원칙이다.
만일 하나의 파일에 여러 클래스가 있을 경우 클래스 중 main()이 들어있는 클래스의 이름과 소스 파일명이 같아야한다.
class Car{ String color; //필드 정의 int speed; int gear; void print(){ //메소드 정의 System.out.println("<" + color + "," + speed + "," + gear + ">"); } } class CarTest{ public static void main(String[] args){ Car myCar = new Car(); //객체 생성 myCar.color = "red" ; //객체 필드 변경 myCar.speed = 0; myCar.gear = 1; myCar.print(); //객체 메소드 } } | cs |
-클래스 구성요소
= 필드 : 객체의 데이터가 저장되는 곳, 데이터 선언 및 초기화 하는 공간(int fieldName;)
-객체의 고유 데이터, 상태 정보를 저장하는 곳
-생성자와 메소드 전체에서 사용되며 객체가 소멸되지 않는 한 객체와 함께 존재
-초기화 하지 않으면 각 자료형의 기본값으로 초기화
<필드선언>
-생성자 선언과메소드 선언의 앞 뒤 어떤 곳에서도 필드 선언 가능
-단, 생성자와 메소드 내부에서는 선언될 수 없음(생성자, 메소드 내부의 변수 = 지역 변수)
<필드 선언>
-필드 값을 읽고 변경하는 작업
-클래스 내부에서는 단순히 필드 이름으로 읽고 변경
-클래스 외부에서는 클래스로부터 객체 생성 후 사용(일반적으로 직접 접근 못하게 캡슐화)
= 생성자 : 객체 생성 시 초기화 역할 담당, new 연산자(Car car = new Car;)
-new 연산자로 호출되는 특별한 중괄호 블록
-객체 생성 시 초기화 담당
-필드를 초기화하거나 메소드를 호출해서 객체를 사용할 준비
-클래스 이름으로 되어 있고 리턴 타입이 없음
<생성자 생성>
-생성자를 선언 안해도 기본적으로 컴파일시 디폴트 생성자가 생성됨
-생성자는 메소드와 비슷한 모양을 가지나, 리턴 타잆이 없고 클래스 이름과 동일
-클래스에 생성자가 명시적으로 선언되어 있을 경우 반드시 선언된 생성자를 호출해서 객체를 생성
-하나라도 인자값을 가진 다른 생성자를 호출할 경우 디폴트 생성자는 자동으로 생성되지 않으므로 디폴트 생성자를 호출하기 위해선 디폴트 생성자도 명시적으로 선언해줘야 함
<필드 초기화>
-필드를 선언할 때 초기값을 주면 동일한 클래스로부터 생성되는 객체들은 모두 같은 데이터를 가짐
-객체 생성 시점에 외부에서 제공되는 다양한 값들로 초기화 되어야 한다면 생성자에서 초기화 해야 함
<관례적으로 필드와 동일한 이름을 갖는 매개변수 사용>
-이 경우 필드와 매개변수 이름이 동일하므로 생성자 내부에서 해당 필드에 접근할 수 없다
-why? 동일한 이름의 매개 변수가 사용 우선순위가 높다. 따라서 this 를 사용한다.
-this는 객체 자신의 참조
<생성자 오버로딩>
-매개변수를 달리하는 생성자를 여러 개 선언하는 것
-오버로딩 시 주의점은 매개 변수의 타입과 개수 그리고 선언된 순서가 똑같을 경우 매개 변수 이름만 바꾸는 것은 오버로딩이라고 볼 수 없음
<다른 생성자 호출(this())>
-생성자 오버로딩이 많아질 경우 생성자 간의 중복된 코드 발생
-이 경우 필드 초기화한 내용은 한 생성자에만 집중적으로 작성하고 나머지 생성자는 초기화 내용을 가지고 있는 생성자를 호출하는 방법으로 개선
-생성자에서 다른 생성자 호출할 때 this() 코드 사용
-this()는 자신의 다른 생성자를 호출하는 코드, 반드시 생성자 첫줄에서만 허용
public Cat(String name, String breed){ this.name = name; this.breed = breed; } public Cat(String name, String breed, int age){ this(name,breed); this.age = age; } | cs |
= 메소드 : 객체의 동작에 해당하는 실행 블록 (void methodName(){..})
<클래스명 작성 규칙>
작성규칙 | 예 |
---|---|
하나 이상의 문자로 이루어져야 한다 | Car, SportsCar |
첫 번째 글자는 숫자가 올 수 없다 | Car, 3Car(x) |
'$','_' 외의 특수 문자는 사용할 수 없다 | $car, _Car, @Car(x), #Car(x) |
자바 키워드(예약어)는 사용할 수 없다 | int(x), for(x) |
단일 단어 => 첫문자는 대문자 혼합 단어 => 각 단어 첫글자는 대문자 |
<메서드 선언>
[접근 제한자] [기타 제어자] 반환자료형 메서드명(매개변수){ //return 리턴값; } | cs |
<메서드 선언부 = 메서드 시그너처>
<리턴 타입>
-메서드가 실행 후 리턴하는 값의 타입
-메서드 실행 후 결과를 호출한 곳에 넘겨줄 경우에는 리턴 값이 있어야 함
-리턴 값의 타입은 선언부의 반환자료형과 동일해야 함
-리턴 타입이 있다고 해서 반드시 리턴값을 변수에 저장할 필요 없음
-void 타입의 경우 리턴문 없이 사용 가능
<매개 변수의 수를 모를 경우>
-매개 변수를 배열 타입으로 선언
-… 으로 선언후 리스트 나열
public int sum(int ... args){ return IntStream.of(args).sum(); } | cs |
<메서드는 클래스 내/외부의 호출에 의해 실행>
-클래스 외부에서 호출할 경우 우선 클래스로부터 객체 생성
-클래스 참조변수 = new 클래스(매개값); * 참조변수.메서드(매개값); (리턴값 없거나, 받지 않을 경우) * 타입 변수 = 참조변수.메서드(매개값); (리턴값 받고 싶을 때)
<메서드 오버로딩>
-클래스 내에 같은 이름의 메서드를 여러 개 선언하는 것
-매개 변수의 타입, 개수, 순서 중 하나가 달라야 한다 (시그니처가 달라야 한다)
#예시
import java.util.Scanner; public class InstanceMemberEx01 { int a, b; // 인스턴스 필드 public InstanceMemberEx01(int c, int d) { // 생성자(필드 초기화) a = c; b = d; } public void add(){ // 인스턴스 메소드 System.out.println(a+b); } public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("2개의 정수를 입력"); int num1 = sc.nextInt(); int num2 = sc.nextInt(); InstanceMemberEx01 im = new InstanceMemberEx01(num1, num2); // 인스턴스 생성 및 생성자 호출 im.add(); // 인스턴스 메소드 호출 } } | cs |
##여기 까지 요약
1. 인스턴스 멤버(메소드, 필드)는 인스턴스를 생성해야지만 사용이 가능하다.(클래스멤버와의 차이점)
2. this는 자기 자신을 의미하는 키워드이다.
3. this.은 필드와 매개변수가 동일할 때 주로 사용되며 인스턴스 멤버임을 명확하게 해준다.
4. this()는 자기 자신의 생성자를 호출할 때 사용하며 호출하는 곳의 첫 번째 문장에 작성해야 한다.
2. 정적 멤버와 static
-정적(static)멤버는 클래스에 소속된 멤버(필드, 메소드) 의미
-static이라는 키워드가 붙은 필드 or 메소드가 정적 멤버이다.
<정적 멤버 선언>
-정적 필드 선언
static 타입 필드 [=초기값]; //static int a; | cs |
-정적 메소드 선언
static 리턴타입 메소드([매개변수]){...}//static void sum(){..} | cs |
-static으로 생성된 필드(전역 변수)는 static이라는 메모리 영역에 저장되어 프로그램이 종료될 때 까지 메모리상 남음
=몇 개의 인스턴스를 생성하든 클래스 당 단 1개의 값 가짐
public class StaticMemberEx01{ static int a; //정적 필드 int b; //인스턴스 필드 StaticMemberEx01(int a, int b){ this.a = a; //매개값 할당 this.b = b; //매개값 할당 } public String print(){ String value = "a : " + a + ", b : " +b; return value; } public static void main(String[] args){ StaticMemberEx01 sm = new StaticMemberEx01(1,2); StaticMemberEx01 sm1 = new StaticMemberEx01(2,3); StaticMemberEx01 sm2 = new StaticMemberEx01(3,4); System.out.println(sm.print()); // a : 3, b : 2 System.out.println(sm1.print()); // a : 3, b : 3 System.out.println(sm2.print()); // a : 3, b : 4 } } //인스턴스를 여러 번 생성하여도 메모리에서 한 번만 공간 할당하여 메모리 아 | cs |
'Language Study > Java' 카테고리의 다른 글
제주에서 자바_Week2_1 (0) | 2019.07.22 |
---|---|
제주에서 자바_Week1 (0) | 2019.07.20 |
3. 참조 타입 (0) | 2019.05.28 |
2. 조건문 & 반복문 (0) | 2019.05.27 |
1. 타입, 연산자 (0) | 2019.05.27 |