일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 이클립스
- c:if
- SpringBoot
- 백엔드
- 프론트엔드
- select
- Java
- It
- css
- 웹개발자
- 연산자
- 생활코딩
- c:foreach
- 국비학원
- 코딩
- 프론트엔드 #HTML
- 프론트엔드 #import
- option
- 코린이
- 인턴일기
- 국비지원
- 제어문
- Selectbox
- 자바
- forEach
- 인턴합격
- 비전공자
- 프론트엔드 #HTML # JSP
- html
- 소스가져오기
- Today
- Total
IT 성장 일기
22.02.03-java_객체지향 프로그램/Object/Scanner 본문
본격적으로 객체지향 프로그램에 대해 배웠다.
수업만으로는 객체지향이 뭔지, 그 개념이 잘 잡히지 않았다.
따라서, 유튜브 생활코딩으로 그 개념을 보충했다.
객체(object) 지향 프로그래밍
로직(변수,메소드)을 서로 연관되어 있는 기능별로 그룹핑하는 기능을 프로그래밍 차원에서 언어차원에서 제공하게 됨.
그렇게 그룹핑된 하나하나의 단위들을 객체라고 한다. 이 객체는 재활용성이 높아짐.(일종의 부품으로 사용되는 것)
객체 객체
웹 페이지의 본문 | 댓글 |
변수 메소드 |
변수 메소드 |
객체지향 프로그래밍 교육
크게 두가지로 구분
1.문법 : 언어가 제공하는 기능 익히기
2.설계 : 좋은 객체를 만드는 법. (현실을 추상화하는것.)
현실에서 관심있는 관점을 소프트웨어화하여 문제를 하결하는 것: 프로그래밍.
하지만 현실이 훨씬 복잡.(추상화: 현실에서 필요한 것만을 추출하여 단순화 시키는 것 ex)지하철 노선도)
은닉화, 캡슐화
제대로 된 부품이라면 그것이 어떻게 만들어졌는지 모르는 사람도 그 부품을 사용하는 방법만 알면 쓸 수 있어야한다.
내부의 동작 방법은 케이스에 숨기고(객체) 사용자에게는 그 부품의 사용법(메소드-어떤 메소드가 있고, 어떤 입력값을 갖고, 출력값을 갖는지 등)만 노출시키는것.
-객체가 어떻게 생겼는지 몰라도 메소드를 사용할 수 있다.
인터페이스
상호 교환 가능하도록 표준화하면 부품 교환이 쉽다. 그리고 이 부품의 연결점을 인터페이스라고 한다.(모니터 회사는 달라도 HDMI 연결 선이 표준화 되어있어 모니터라는 부품을 쉽게 교환 할 수 있다.)
객체(Object)
- 클래스(Class)와 인스턴스(instance)를 통해 객체를 만든다.
-중복의 제거를 위해 메소드를 사용한다.
클래스
객체를 만들기 위한 일종의 '설계도' (메소드의 정의)
인스턴스
그 설계도에 따라 만들어진 구체적인 '제품'(메소드의 사용 : 호출)
=구체적인 객체.
ex
public statice void main(String[] args) {
Calculator c1 = new Calculator();
c1.setOprands(10,20);
c1.sum();
c1.avg();
Calculator c2 = new Calculator();
c2.setOprands(20,40);
c2.sum();
c2.avg();
}
Calculator c1=new Caluclator(); 에서,
Calculator()-->객체를 new Calculator();로 새로 만듦.
이 새로 만든 객체를 c1이라는 변수에 담음.
c1에 담겨있는 실제 객체 Calculator()의 내용을 인스턴스라고 한다.
c1.setOprands(10,20); --->Calculator라는 객체의 setOprands라는 메소드. 10,20은 setOprands에 전달되는 인자값(매개변수).
그러면 어떻게 이 객체라는 것이 재활용 되는가?
c1밑의 new Calculator();를 통해서 또 한 번 인스턴스를 생성한다. 이 새로 생성한 인스턴스는 c2에 담긴다.
Class Calculator{
int left, right;
}
public void setOprands(int left, int right){
this.left=left;
this.right=right;
}
public void sum(){
System.out.println(this.left+this.right);
}
public void avg(){
System.out.println((this.left+this.right)/2);
}
}
Class는 Calculator라는 객체의 설계도를 알려주겠다는 것이다.
즉, Class에 포함된 변수 int left, right 와 함수setOprands, sum,avg의 집합이다.
this.left-->생성한 c1에 담겨있는 Calculator라는 Class를 구체적인 제품으로 만든 인스턴스를 가르킨다.
즉, Class를 생성할 때 초입에서 선언한 변수를 가르킨다. (인스턴스 자신을 가르킴.)
this.이 붙어 있지 않은 left, right는 함수에 작성한 매개변수를 의미한다.
클래스 멤버와 인스턴스 멤버
멤버: 구성원을 의미한다. 객체도 구성원이 있는데, 아래와 같다.
-변수
-메소드
인스턴스 멤버
위의 코드에서,
Calculator c1=Calculator();
c1.setOprands(10,20);
Calculator c2=Calculator();
c2.setOprands(20,40)
10,20,20,40이라는 수를 setOprands에 인자로 전달했다. 그리고 setOprands에서 this.left와 this.right에 의해서 전달한 이 매개변수들을 인스턴스"의" 변수(left, right)로 지정할 수 있었다.
클래스 멤버
인스턴스의 소유가 아닌 변수도 존재한다. 바로, 클래스에 소유인 변수가 존재한다.
이 클래스의 멤버 변수는 모든 인스턴스에서 똑같은 값을 가진다.뿐만 아니라, 인스턴스를 생성하지 않고도 직접 클래스에 접근해 클래스에 소속 되어있는 변수에 접근해 그 값을 사용할 수 있다.
모든 인스턴스가 공유하는 변수를 만들면 편리하다. 바로 그 역할을 하는 것이 클래스 변수이다.
인스턴스 변수: 인스턴스마다 다른 값을 가지는 변수
클래스 변수: 클래스에 속한 모든 인스턴스들은 그 클래스 변수의 값을 가진다.
예를 들어,
원의 넓이를 구하는 메서드와 원의 둘레를 구하느 메서드 모두 원주율값이 필요하다.
즉, 파이=3.14가 중복으로 필요하므로 이 파이 값을 클래스의 변수로 지정하는 것이 중복을 제거 할 수 있다.
Class Calculator{
static double PI=3.14;// static이라는 키워드가 붙으면 클래스 변수.모든 인스턴스에서동일한 값으로 사용.
int left, right
}
정리
클래스 변수의 용도
static이라는 키워드가 붙으면 클래스 변수.모든 인스턴스에서동일한 값으로 사용.
1.인스턴스에 따라서 변하지 않는 값이 필요한 경우(ex:PI-이런 경우 final을 이용해 상수로 선언하는 것이 바람직하다.)
2.인스턴스를 생성할 필요가 없는 값을 클래스에 저장하고 싶은 경우.
3.값의 변경 사항을 모든 인스턴스가 공유해야 하는 경우.
클래스 메소드
지금까지는 아래의 코드와 같이 인스턴스를 만들었다.
Calculator c1=new Calculator();
c1.setOprands(10,20);
하지만 인스턴스가 존재하지 않는 경우도 있다. 아래와 같이 클래스에 직접 접근하여 메소드를 호출한다.
public static void main(String[] args){
Calculator3.sum(10,20);
Calculator3.avg(10,20);
}
이제 이 sum과 avg를 보면 아래와 같은데, 인스턴스 메소드와 다른 점이 있다.
public static void sum(int left, int right){
System.out.println(left+right);
}
public static void avg(int left, int right){
System.out.println((left+right)/2);
}
메소드에 변수와 마찬가지로 static이라는 키워드를 달면 클래스 메소드가 된다.
이 클래스 메소드는 인스턴스 메소드와는 다르게 클래스를 통해서 직접적으로 접근해서 실행할 수 있다는 차이가 있다.
Calculator3.sum(10,20);
타입별 비교
1.인스턴스 메소드는 클래스 멤버에 접근 할 수 있다.
2.클래스 메소드는 인스턴스 멤버에 접근 할 수 없다.
용어
-인스턴수 변수->Non-Static-Field
-클래스 변수->Static-Field
스캐너
Scanner또한 BufferReader와 마찬가지로 문자열을 입력받는데 사용된다.
가장 뚜렷한 차이는 BufferReader의 속도가 훨씬 빠르다.
사용법은 아래와 같다.
sc.close(); //단, 입력을 반복해서 받아야하는 경우에는 사용하지 않도록 한다.
입력을 사용할때 키보드를 통해 입력받는 경우도 있지만 파일등을 통해 입력을 받는 경우도 있다.
파일작업의 순서는 사용하고자 하는 파일을 열고, 사용 , 닫기 순인데, 파일을 열어놓고 닫지를 않는경우
파일이 손상될 수가 있다. 기본적으로 파일작업은 열고/닫고를 꼭 해주어야 한다.
사실 키보드 입력의 경우 close()를 해주지 않아도 별상관 없지만, 리소스를 사용하는 경우에는 되도록
sc.close()해주는 습관을 들이는것이 좋다.
스캐너에서 String 타입은 2가지다.
next()-컴퓨터가 입력한 문자열의 끝을 띄어쓰기와 엔터(줄바꿈) 2가지로 판단한다.
ex)I'm a student -> I'm
nextLine()- 띄어쓰기를 문자열에 포함하고 엔터(줄바꿈)만 문자열의 끝으로 인식한다.
ex)I'm a student -> I'm a student 전체 인식
스캐너와 버퍼리드의 차이점은 아래와 같다.
Scanner
- java.util.Scanner 클래스
- 기본 유형과 문자열을 구문 분석 할 수 있는 간단한 텍스트 스캐너
- 내부적으로 정규식을 사용하여 다른 유형을 읽기 가능
- Java 프로그램에서 입력을 읽는 가장 쉬운 방법
- 특정 데이터 유형을 읽기 위해 사용할 함수는 nextXXX() (nextInt(), nextFloat(), nextByte(), nextShort(), nextDouble(), nextLong(), next()) 사용 가능
- 문자열을 읽으려면 nextLine()을 사용
- 단일 문자를 읽으려면 next(), charAt(0)을 사용
- next() 함수는 입력의 다음 토큰 / 단어를 문자열로 반환하고, charAt(0) 함수는 해당 문자열의 첫 번째 문자를 반환
BufferReader
- Java.io.BufferedReader 클래스
- Buffer를 이용해 입출력의 효율을 높혀줌
- 문자 입력 스트림으로, 텍스트를 읽고 문자를 버퍼링하여, 문자 시퀀스를 효율적으로 읽을 수 있도록 함 (line단위의 입출력이 편리함)
- 버퍼 크기를 지정하거나 기본 크기를 사용할 수 있으며, 기본값은 대부분의 목적에 충분히 큼
- 일반적으로 Reader의 각 읽기 요청은 해당 읽기 요청이 기본 문자 또는 바이트 스트림으로 이루어 지도록 함
- 따라서 FileReaders 및 InputStreamReaders[^1]와 같이 read () 작업에 비용이 많이들 수 있는 판독기 주위에 BufferedReader를 래핑하는 것이 좋음
- 텍스트 입력에 DataInputStreams를 사용하는 프로그램은 각 DataInputStream을 적절한 BufferedReader로 대체하여 지역화 할 수 있음
'IT 학습 노트 > Java' 카테고리의 다른 글
22.02.07-java_상속(Inheritance)/오버라이드(Override) (0) | 2022.02.08 |
---|---|
22.02.04-java_유효범위/Overload(오버로드)/Constructor(생성자) (0) | 2022.02.05 |
22.01.28-java_For문/Method(함수)/Array(배열)/ (0) | 2022.01.30 |
22.01.27-java_난수/Switch/While/DoWhile/For (0) | 2022.01.27 |
22.01.26-java_Parsing/Argument/연산자/Input/Casting/AsciiCode/If (0) | 2022.01.26 |