일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- PHPStorm
- 깃 토큰
- MySQL
- csv
- database
- console창
- localhost
- Python
- 에러
- 오류
- visualstudio code
- DataGrip
- 파이썬
- clone
- import data
- 클론
- vscode
- cmd
- error 해결
- github clone
- OrCAD 다운로드
- php
- run sql script
- 단축키
- 데이터베이스
- 따옴표 삭제
- github token
- error
- jupyter
- Visual Studio Code
- Today
- Total
개발 노트
7/27 추상클래스, 인터페이스, 객체 계층 확인, 자바 주요 클래스, return 본문
7/27 추상클래스, 인터페이스, 객체 계층 확인, 자바 주요 클래스, return
hayoung.dev 2022. 7. 27. 19:34[8. 자바 다형성, 추상 Interface 복습]
추상클라스와 인터페이스 비교 - 면접 질문 많이 나옴 중요
p.9 추상메서드(abstract method) - 선언부만 있고 구현부(몸통, body)가 없는 메서드
p.14 인터페이스(interface)
1. 일종의 추상클래스. 추상클래스(미완성 설계도)보다 추상화 정도가 높다. 전체가 추상메서드로 이루어져 있기 때문이다.
2. 인터페이스가 무엇인지 물어보는 면접 질문 나옴.
p.21 추상 class 비교 - 면접 단골 문제임. 중요함.
- 인터페이스는 추상 클래스와 유사하지만 상수와 추상 메소드로만 구성되어 있다.
- 인터페이스는 추상 클래스보다 더 완벽한 추상화 제공
- 인터페이스는 다중 상속(Multiple Inheritance) 지원(인터페이스의 장점임.)
[Strategy pattern]
*객체에 대한 계층 확인 단축어 : ctrl + t -> class 객체에 대한 계층이 나옴(족보)
*object에 의해 만들어진 메소드들.
[9. 자바 주요 클래스]
p.2 패키지란 관련있는 다수의 class 모음.
패키지가 다른 클래스들이 서로를 쓰고 싶을 땐 자동완성으로 import를 해준다.
p.3 cmd창에서
* .점 하나는 현재 폴더(나의 폴더), ..점 두 개는 부모 폴더
1. 패키지 클래스 컴파일 : 파일 위치로 cd 이동 후 >javac -d . 자바파일이름.java
p.5 패키지 개요와 종류
1. 패키지 개념 : 비슷한 종류의 클래스나 인터페이스들을 묶어 패키지화 한다
2. JDK에서 많은 패키지 제공
☞java.lang : 자바 프로그램의 기본적인 기능을 제공. 명시적으로 지정하지 않아도 모든 자바 프로그램에 포함되는 패키지
☞ java.util : 유용한 유틸리티 클래스를 제공
☞ java.io : 입출력 기능을 제공하는 패키지
☞ java.net : 네트워킹과 관련된 기능을 제공하는 패키지. telnet, ftp, http 와 같은 프로토콜을 사용할 수 있는 클래스를 제공
☞ java.awt : 그래피컬 사용자 인터페이스(GUI)를 구축하기 위한 다양한 컴포넌트를 제공하는 패키지
☞ java.awt.event : AWT 컴포넌트들의 이벤트를 제어하는 패키지
☞ java.applet : 애플릿 프로그램과 연관된 클래스를 제공하는 패키지
[OSI 7계층 구조] (외울 필요 없음)
p.8 자바 API
자바 API - 자바 Application Programming Interface의 약어로서 자바 프로그램을 작성할 수 있도록 썬 마이크로시스템사에서 제공해주는 클래스
2. 자바 API Documentation - 자바 클래스들에 대한 도움말 - http://docs.oracle.com/javase/8/docs/api/index.html
3. 자바 API Documentation 문서 다운받아 설치하기
1) www.oracle.org에 접속하여 화면 위쪽 [Downloads] 항목 중에서 "Java SE"를 선택
2) 화면에서 Documentation을 찾아서 [Download]를 클릭한다.
3) 클릭하여 다운로드한다.
4) 다운로드한 압축 파일을 풀어준다. 압축 파일을 푼 후에 “index.html”을 찾아 웹 브라우저에 띄운다.
TestJava1.java (default package 만드는 법 : 패키지 이름 지우면 자동으로 생성됨.)
public class TestJava1 {
public static void main(String[] args) {
System.out.println("TestJava1 Run...");
}
}
[ch09 패키지]
Integer1.java
package ch09;
public class Integer1 {
public static void main(String[] args) {
String str = "3";
//JAVA Module화를 포함한 것이 JDK이고, JAVA API에 있음.
//값을 받은 것을 숫자로 반환할 수 있다.
//Integer.parseInt 많이 쓰므로 외우기.
int int1 = Integer.parseInt(str); //문자를 숫자로 변환(단 문자가 실제론 숫자여야 함. 예를들어 문자가 a라면 오류남.)
int int2 = Integer.valueOf("3"); //String을 받아서 Integer로 값을 변환해줌
System.out.println("int1 -> " + int1);
System.out.println("int2 -> " + int2);
System.out.println(int1+int2);
System.out.println("int1+int2 -->" + (int1 + int2)); //괄호를 안하면 더하기가 아니라 그냥 붙여넣기가 됨.
}
}
출력 결과
궁금한 점 : Integer.valueOf 를 하면 Integer 값으로 나오는데 어떻게 int int2에 넣었을 때 오류가 나지 않는지? 왜 int형으로 받아들여지는건지?
-> 구글링 결과 : Integer객체를 반환해도 Java에서 래퍼클래스(Wrapper class)를 통해 Autoboxing.. Unboxing..을 하여 int형으로 변하는 듯 함
Calender1.java
package ch09;
import java.util.Calendar;
public class Calender1 {
public static void main(String[] args) {
//기본 Today
Calendar cal = Calendar.getInstance();
int year = cal.get(Calendar.YEAR);
int month = cal.get(Calendar.MONTH)+1; //0월부터 + 1
int date = cal.get(Calendar.DATE);
System.out.printf("오늘은 %d년 %d월 %d 입니다. \n", year, month, date);
int hour = cal.get(Calendar.HOUR);
int min = cal.get(Calendar.MINUTE);
int sec = cal.get(Calendar.SECOND);
System.out.printf("지금은 %d:%d:%d시 입니다.\n", hour, min, sec);
}
}
출력 결과
GreCal1.java
package ch09;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.GregorianCalendar;
//그래고리력
public class GreCal1 {
public static void main(String[] args) {
GregorianCalendar gc = new GregorianCalendar();
int year = gc.get(GregorianCalendar.YEAR);
int month = gc.get(GregorianCalendar.MONTH) + 1; //0월부터 시작이므로 1 더함.
int day = gc.get(GregorianCalendar.DATE);
System.out.printf("오늘은 %d년 %d월 %d일 입니다. \n", year, month, day);
//(E) : 요일 (a) : 오전/오후
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd(E) (a)hh:mm:ss"); //대문자 M이 월
//SimpleDateFormat sdf = new SimpleDateFormat("yyyy/mm/dd(E) (a)hh:mm:ss"); //소문자 m은 분
//Date import할 때 등 날짜 import할 때는 꼭 java.util이어야 함.
Date date = gc.getTime();
System.out.println(sdf.format(date));
}
}
출력 결과
Math1.java
package ch09;
public class Math1 {
public static void main(String[] args) {
int[] i = new int[6];
for(int j =0; j<6; j++) {
//random 자동완성 할 때 double형이라고 나왔기 때문에 (int)로 캐스팅해야한다.
//Math.random() 함수는 0.0<=랜덤값<1.0을 반환하기 때문에
//곱하기 45를 해주면 0<=랜덤값<45이고, 1부터 출력하기 위해 +1을 해준다.
//그럼 1<=랜덤값<46이 된다.
int lotto = (int) (Math.random() * 45)+1; //1부터
i[j] = lotto;
}
System.out.println("---Lotto 당첨번호---");
for(int j = 0; j<i.length; j++) {
System.out.println(j +"번째:" + i[j]);
}
}
}
출력 결과
Math2.java
package ch09;
public class Math2 {
public static void main(String[] args) {
double d1 = -4.156, d2 = 4.67, d3 = -4.15, d4 = -4.67;
//round는 (소수점 첫째자리) 반올림
System.out.println("Round d1 = " + Math.round(d1));
System.out.println("Round d2 = " + Math.round(d2));
System.out.println("Round d3 = " + Math.round(d3));
System.out.println("Round d4 = " + Math.round(d4));
//floor는 자기보다 작은 정수 중 가장 큰 수 = (소수점 첫째자리) 내림
System.out.println("floor d1 = " + Math.floor(d1));
System.out.println("floor d2 = " + Math.floor(d2));
System.out.println("floor d3 = " + Math.floor(d3));
System.out.println("floor d4 = " + Math.floor(d4));
//ceil는 자기보다 큰 정수 중 가장 작은 수 = (소수점 첫째자리) 올림
System.out.println("ceil d1 = " + Math.ceil(d1));
System.out.println("ceil d2 = " + Math.ceil(d2));
System.out.println("ceil d3 = " + Math.ceil(d3));
System.out.println("ceil d4 = " + Math.ceil(d4));
}
}
출력 결과
ToStringEx.java
package ch09;
class StrPrint {
String name;
int prnInt = 7;
StrPrint (String name) {
this.name = name;
}
//개발자가 override(시스템에 toString이 있어도 내가 재정의해서 쓸 수 있다.)
//객체에 대해 toString을 보고싶은 용도로 출력한다.
@Override
public String toString() { //2. 해시코드를 원하는 형태로 출력해서 봐야 함.
//return super.toString //원래의 toString
return "이름: " + name + " , 번호 : " + prnInt;
}
}
public class ToStringEx {
public static void main(String[] args) {
StrPrint sp1 = new StrPrint("경찰회의");
StrPrint sp2 = new StrPrint("코로나");
//1. hash code of the object(오브젝트의 해시코드 즉 객체를 가리키는 일련번호(주소랑 다름))를 보여준다.
System.out.println("sp1->" + sp1.toString());
System.out.println("sp2->" + sp2);
}
}
출력 결과
Person.java
package ch09;
public class Person {
int id;
String name;
public Person (int id, String name) {
this.id = id;
this.name = name;
}
//equals ctrl+space 하면 나옴
//내가 원래의 equals를 무시하고 재정의하겠다.
//return형
@Override
public boolean equals(Object obj) {
//return super.equals(obj); //이게 원래 equals 동작
Person p = null;
boolean b = false;
//객체 비교할 때 instanceof 사용
//(obj instanceof Person) p의 뜻 : 만약 Person이 obj와 같다면 p인스턴스를 obj로 바꿔줌
//즉 Person이 obj와 같지 않으면 obj에 값이 없는 것이기 때문에 그 다음 if문에서 obj!=null 을 확인하는 것임.
if(obj instanceof Person) p = (Person) obj;
if(obj != null && this.id==p.id && this.name==p.name) b = true;
return b;
}
}
PersonEx.java
package ch09;
public class PersonEx {
public static void main(String[] args) {
Person person1 = new Person(111, "김준수");
Person person2 = new Person(111, "김준타");
if (person1.equals(person2)) System.out.println("같다");
else System.out.println("다르다");
}
}
출력 결과
p.20 Object 클래스 - equals(Object obj)
- 객체 자신 주어진 객체(obj)를 비교한다. 같으면 true, 다르면 false.
- Object클래스에 정의된 equals()는 참조변수 값(객체의 주소)을 비교한다.
public boolean equals (Object obj) {
return (this==obj)
}
ReturnClassEx.java
package ch09;
class ReturnTest {
int empid;
String ename;
String tel;
public ReturnTest() {
}
public ReturnTest (int empid, String ename, String tel) {
this.empid = empid;
this.ename = ename;
this.tel = tel;
}
}
class ReturnClass {
int id;
String name;
public ReturnClass (int id, String name) {
this.id = id;
this.name = name;
}
//void -> return형 없음.
public void rtnTest1() {
System.out.println("rtnTest1 ...");
// return;
}
//public int 이므로 -> return의 형은 int여야 함.
public int rtnTest2(int kkk) {
System.out.println("rtnTest2 ...");
int result = kkk*10;
return result;
}
//String -> return형 String
public String rtnTest3() {
String strResult = "안녕";
System.out.println("rtnTest3 ...");
return strResult;
}
//객체형 return(실무에서 가장 많이 씀)
public ReturnTest rtnTest4() {
ReturnTest returnTest = new ReturnTest(100, "김유신", "01012345678");
returnTest.ename = "김춘추"; //값을 가공
System.out.println("rtnTest4 ... ReturnTest return");
return returnTest;
}
}
public class ReturnClassEx {
public static void main(String[] args) {
ReturnClass returnClass = new ReturnClass(1234, "Return Test");
returnClass.rtnTest1(); //변수에 넣는 것 없이 그냥 돌림
int k11 = returnClass.rtnTest2(12);
System.out.println("returnClass.rtnTest2(12) 결과-->" + k11);
String kStr = returnClass.rtnTest3(); //return명이 strResult와 kStr로 달라도 됨. 둘 다 String 타입으로 타입만 같으면 됨.
System.out.println("returnClass.rtnTest3 결과-->"+kStr);
//객체에 대한 return 방법
ReturnTest returnTest4 = new ReturnTest();
returnTest4 = returnClass.rtnTest4();
//ReturnTest returnTest4 = returnClass.rtnTest4(); //위의 두 줄과 같음.
//returnTest4.empid 이렇게 점만 찍으면 멤버변수를 소환할 수 있다.
System.out.println("returnClass.rtnTest4 returnTest4.empid-->"+returnTest4.empid);
System.out.println("returnClass.rtnTest4 returnTest4.ename-->"+returnTest4.ename);
System.out.println("returnClass.rtnTest4 returnTest4.tel-->"+returnTest4.tel);
}
}
출력 결과
Math3.java
package ch09;
public class Math3 {
public static void main(String[] args) {
int[] i = new int[6];
int count = 0; //lotto의 count를 셈.
while(count < 6) { //count 즉 랜덤값이 중복 제외 6번 실행.
int lotto = (int) (Math.random() * 45)+1;
//중복값 발생하면 lotto를 0으로 하여 17줄의 if문이 실행이 안되고 다시 9줄로 돌아와 새로운 랜덤값을 생성하게 된다.
//if문이 실행되지 않았으므로 count는 측정되지 않는다.
for(int j=0; j<6; j++) {
if(lotto == i[j]) {
lotto = 0; //중첩 발생
break;
}
}
if (lotto>0) {
//i[count++] = lotto; //0일 때는 중복값이 있다는 뜻. 하단 두 줄과 같은 동작함.
i[count] = lotto;
count++;
}
//for(int j =0; j<6; j++) {
// int lotto = (int) (Math.random() * 45)+1;
// i[j] = lotto;
//}
System.out.println("---Lotto 당첨번호---");
for(int j = 0; j<i.length; j++) {
System.out.println(j +"번째:" + i[j]);
}
}
}
}
출력 결과
RegulaEx.java
그 외 Pattern.compile은 구글에 정규표현식 검색하여 설정.
package ch09;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegulaEx {
public static void main(String[] args) {
String[] data = {"bat", "baby", "bonus", "cA","ca",
"cO", "c.", "c0", "car","combat","count",
"date", "disc"};
//c의 뜻 : 맨 앞의 한 글자는 c로 시작해야 한다.
//[a-z]의 뜻 : c다음 글자는 영어 소문자여야 한다.
//*의 뜻 : 아무 글자나 올 수 있다.
Pattern p = Pattern.compile("c[a-z]*");
for(int i = 0; i<data.length; i++) {
//data[i]가 p와 매치하면 m에 넣음
Matcher m = p.matcher(data[i]); //Matcher의 뜻 : 매칭된 것만 들어옴.
if(m.matches()) { //만약 m과 일치하면
System.out.print(data[i] + ", ");
}
}
}
}
출력 결과
DateTimeOperationExample.java
package ch09;
import java.time.LocalDateTime;
public class DateTimeOperationExample {
public static void main(String[] args) {
LocalDateTime now = LocalDateTime.now();
System.out.println("현재시 : " + now);
//LocalDateTime targetDateTime = now.plusYears(1); //연도 변환
//LocalDateTime targetDateTime = now.plusYears(1).minusMonths(2);
//LocalDateTime targetDateTime = now.plusYears(1).minusMonths(2).plusDays(3);
//LocalDateTime targetDateTime = now.plusYears(1).minusMonths(2).plusDays(3).plusHours(4);
LocalDateTime targetDateTime = now.plusYears(1)
.minusMonths(2)
.plusDays(3)
.plusHours(4)
.minusMinutes(5);
System.out.println("연산 후 : " + targetDateTime);
}
}
출력 결과