소프트웨어를 개발할 때에도 부품에 해당하는 객체들을 먼저 만들고,
이것들을 하나씩 조립해서 완성된 프로그램을 만드는 기법을 객체 지향 프로그래밍 (OOP : Object Oriented
Programming) 이라고 한다.
객체
객체 : 추상적인 것 중에서 자신의 속성과 동작을 가지는 모든 것 (물리적으로 존재하는) / 모델링이 가능
-필드/변수(속성)
-메소드(동작)
객체들과의 관계
사용 / 상속(종류객체와 구체적인 사물객체간의) / 집합 (완성품과 부품간의)
객체 지향 프로그래밍
: 객체들을 하나씩 조립해서 만드는 프로그램
캡슐화
객체의 뱐수와 메소드를 하나로 묶고, 은닉/감추는 것
노출유무의 따라 접근제한자를 사용
상속
변수와 메소드를 하위객체에게 물려줌
클래스
- 설계도 역할으로써 객체를 만듬 ( 클래스를 실행시키기위해 객체를 만든다)
- 객체들의 중요한 속성을 공유하는 객체들의 모임
- 용도 : 라이브러리용 (API)
- 클래스는 만들기만 해도 상관 없다 (메소드와 필드가 꼭 있을필요 없다)
객체 생성과 클래스 변수
new 연산자
new 클래스(); 는 힙이라는 메모리를 받고 그 객체안에서 저장이 가능하도록 힙 영역에 객체를 생성시킨 후 객체의 주소를 리턴하도록 () : 생성자를 호출하는 코드
클래스 변수 (객체명 / 인스턴스 ) = 클래스. 변수명
new연산자에 의해 리턴 된 객체의 번지 저장
클래스 변수 = new 클래스 ():
필드 : int fieldName;
변수선언 = “”;
필드 사용 위치
- 같은 클래스에서 사용할시에는 : 변수이름 = (바로사용가능)
- 다른 클래스에서 사용할시에는 : “변수 . 변수이름(가져올 클래스에서의 변수이름)” 으로 사용 ( MyCar . speed = x;
- 다른위치의 클래스에서의 변수접근제안을 막을때에는 private를 사용함
—-다른위치에 있는 필드를 사용하는 이유
힙이라는 메모리에 변수들이 저장되는데
static의 main메소드는 저장공간이 따로 생성되기 때문에 한 공간의 힙에 존재하지 않기때문에 에러발생
따라서 static 메소드에는 새로는 객체(필드 = new필드();)를 생성하고 기존변수와 함께 결합해야한다 !
생성자 : ClassName() (..)
claculator = new calculator ();
클래스로부터 객체를 생성할 때 호출되어 객체의 초기화를 담당한다
개발자 선언한 생성자 존재 시 컴파일러는 기본 생성자 추가하지 않는다
new 연산자로 객체 생성시 개발자가 선언한 생성자 반드시 사용
필드초기화
클래스로 생성만 해놓은 필드(클래스 변수이름;)를 메소드를 만들어 초기화한다.
: 초기값 없이 선언된 필드가 객체 생성될 때 기본값으로 자동 설정되는 것
다른 값으로 필드 초기화하는방법
- 필드 선언할 때 초기값 설정 변수 이름;
- 힙메모리이름.필드이름 = 매게변수; (오류를 적게하는법) this.필드이름 = 매개변수; **(this변수 이용)**
- 생성자의 매개값으로 초기값 설정 클래스 = new 클래스 ();
생성자 오버로딩
똑같은 이름의 생성자를 여러개 만드는것 / 매개변수를 다르게 해야함
다른 생성자 호출 (this())
생성자의 첫줄에서만 허용
this. 필드이름 = 매개변수;
[this 는 맨 첫줄에]
메소드 : void methodName() (…)
객체의 동작(기능)인, {} 중괄호 블록 ( 중괄호의 블록의 이름= 메소드 이름)
생성자와의 차별점 : 리턴타입의 유무
( … ) : 갯수상관없이 넣어줘도 된다는 의미의 연산자
메소드 : return 할 땐 void
리턴타입
메소드가 실행 후 리턴하는 값의 타입
값이 없다면
메소드 이름
자바 식별자 규칙에 맞게 작성
메소드 매개변수 선언
매개변수는 메소드를 실행할 때 필요한 데이터를 외부에서 받기위해 사용
매개변수가 필요 없을 수도 있음 (없는것도 많음)
내 생성자 안에서 생성된 건 생성자나 메소드에서 내꺼처럼 접근해서 사용가능
다른 클래스의 변수를 가져다 쓸 때에는 변수.필드이름 으로 접근
리턴문 return
메소드 실행을 중지하고 리턴값을 지정하는 ( 마지막 리턴을 만나면 그 값을 위로 지정
return true; : 메소드 실행을 중지 시킬 수 있음
경우의 수 (if / for) 참 거짓 문장끝에 다 return을 걸어줘야하는 구문이 있음
메소드 호출
내부 : 그냥 호출
외부 : 객체생성 후 호출
메소드 오버로딩
메소드명이 같아야함/ 개수나 타입을 다르게해야함
서로 다른 시그니처를 갖는 여러 메소드를 같은 이름으로 정의하는 것
경우의 수를 매개변수에 다 입력할 떄 오버로딩으로 사용하는 것 (ex. 직사각형 만들 때)
클래스 내에 같은 이름으로 여러개의 메소드 만드는 것
public void
인스턴스 멤버
객체 마다 가지고 있는 필드와 메소드 (인스턴스 필드/ 인스턴스 메소드)
인스턴스 멤버는 개체 소속된 멤버이기 떄문에 객체가 없이 사용불가
힙 메모리에 다이렉트로 접근할 수 없고 힙의 메모리와 연결된 스택에게
this __this.
객체 자신의 참조를 가지고 있는 / 힙 메모리를 갖고 있는
인스턴스 멤버, 인스턴스 필드임을 정확하게 하기 위해 yhis.변수
필드값의
정적멤버와 static
공통적으로 사용하는 필드들을 위해 static을 사용한다
static은 무조건 “ 클래스이름. “ 으로 접근해야함!!!@
정적멤버는 클래스에 포함된 멤버
객체 내부에 존재하지 않고, 메소드 (클래스/ static) 영역에 존재
정적멤버는 객체를 생성하지 않고 클래스로 바로 접근해 사용
사용
내부사용 할때는 static이 붙여진 건 모두 같은 힙메모리 안에 있기 떄문에, = 정의 하지 않아도 변수를 그대로 가져다 쓸 수 있다.
외부사용 할때는 클래스.변수이름으로 바로 사용이 가능하다
정적초기화블록
static { ~~~~~~} 블럭안에서 쓸수있고, 따로 만들어 다른곳에서
정적 주의할 점 (static be careful)
객체생성하면 힙 메모리에 올라가고, static에서 동작하는 main 메소드에서는 다른 힙 메모리의 객체들을 사용하지 못한다는 내용
객체 생성 후 사용할 것
싱글톤
객체의 인스턴스가 오직 하나만 만들어지는
new 연산자를 통해서
하나를 만들어 놓고 가져다 쓰는 용도
<JSP / SPRING 에서 많이 사용>
singleton.getInstance() : 위에 있는 싱글톤 객체를 리턴하게 되는
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton() {
// 생성자는 외부에서 호출못하게 private 으로 지정해야 한다.
}
public static Singleton getInstance() {
return instance;
}
public void say() {
System.out.println("hi, there");
}
}
상속
하나의 클래스만 물려받을 수 있다
outline
싱글톤
싱글톤_단 하나만 생성된 객체, 클래스 왜부에서 new연산자로 호출할 수 없도록 막아야함
그러므로 private 접근 제한자를 사용
private static 클래스명 singleton = new 필드명 ();
___클래스 내부에서는 new연산자로 생성자 호출이 가능함.
자신의 타입인 정적필드를 하나 선언하고! 자신의 객체를 생성해 초기화 한다.
private 클래스명 () {}
static 필드명 getInstance()
{ return singleton; }
외부에서 호출할 수 있는 정적 메소드인 getInstance를 선언한 것. 그리고 정적 필드에서 참조하고 있는 자신의 객체를 리턴한것~!
=⇒외부에서 객체를 얻는 유일한 방법은 getInstance() 메소드를 호출하는 방법이다.
단 하나의 객체만 리턴하기 떄문에
Final
한 번 정의한 값을 바꾸지 못한다.
final String nation = “Korea”;
public —
nation=”UK”; ⇒ 못바꿈
패키지
클래스를 기능별로 묶어서 그룹 이름을 붙여 놓은 것 (=폴더랑 비슷한개념)
패키지는 단순히 파일 시스템의 폴더 기능만 하는것이 아니라 식별자 역할임
클래스 파일은 선언된 패키지와 동일한 폴더 안에서만 동작함
패키지가 만들어지고 - 그 안에 클래스가 컴파일되는 것이 패키지가 만들어지는 과정임
import문__(ctrl+shifr+O)
- 다른 패키지에 있는 클래스를 사용하려할 때
- import 패키지명.패키지명.패키지명_import. 클래스명.*;
- 같은 패키지 안에 있으면 import가 필요없다
**System.
Java.lang에 들어있는 모든 클래스들은 import를 하지 않고 사용이 가능하다
접근제한자 Access Modifier
- 같은 클래스의 메소드나 변수는 누구건 간에 사용이 가능 (소속이 같기 떄문에)
- 같은 패키지에 있는 다른 클래스가 접속 하려 할 때 : public / protacted / default
- 다른 패키지 : public / protacted (상속관계인 경우에는 사용가능)
- 클래스를 선언할 때 public을 생략했다면 default 접근 제한을 가진다.
- default : 같은 패키지에서는 아무런 제한 없이 사용할 수 있지만, 다른 패키지에선 사용 불가
- public : 다른 패키지에서도 사용 가능 (access 레벨을 public으로 같이 맞춰주는거)
Getter Setter ( source사용할 것 )
Private를 사용했을 때
Getter
private 필드의 값을 리턴하는 역할 - 필요할 경우
- boolean isStop () 으로 활용 ⇒ getstop이 아닌 불룬은 is 사용함
Setter
값을 설정하는
변수에 대한 외부접근을 차단시키고 메소드를 통하여 접근을 해야할 때
'Java' 카테고리의 다른 글
자바 인터페이스 / (1) | 2023.10.03 |
---|---|
자바 상속 / 타입변환 / 다형성 (1) | 2023.10.03 |
자바 참조타입 / 배열 / (1) | 2023.10.03 |
자바 If , swith 조건문/ for , while , do-while , break , continue반복문 / Java If (0) | 2023.10.03 |
자바 변수 Variable / 자바 타입 변환 / Java11 / 자바 기초 (0) | 2023.09.29 |