2020년 9월 21일 월요일

(추천자바강의/자바교육)자바의 Object 클래스, toString(), equals(), hashcode(), 실습(자바동영상/자바강좌/자바/JAVA)

자바강의/자바교육)자바의 Object 클래스, toString(), equals(), hashcode(), 실습(자바동영상/자바강좌/자바/JAVA)


ojc.asia/bbs/board.php?bo_table=LecJava&wr_id=757

불러오는 중입니다...


https://youtu.be/Mdp6rq4v0_o



1. Object 클래스


모든 클래스의 최상위 클래스

모든 객체는 Object의 하위 객체, 즉 소스에서 아무것도 상속 받지 않았다면 컴파일러에 의해 java.lang.Object를 상속하는 클래스로 선언 된다.(extends Object)

Object 타입의 변수는 어떠한 객체도 가리킬 수 있다. 또한 유형을 모르는 객체를 참조하려 할 때 유용하다.

Object obj = new int[10];

Object obj = new StringBuffer(“abc”);


Object obj = getObject();   //어떤 객체가 리턴될지 모르는 경우


객체의 내용을 String 으로 변환

String toString()

모든 객체를 System.out으로 출력할 때 toString() 메소드가 간접적으로 호출되도록 되어있다.

객체의 내용으로 비교

boolean equals(Object obj)

Hash code 생성

int hashCode()

복제된 객체 생성

protected Object clone() throws CloneNotSupportedException

객체가 소멸될 때 불리는 함수

finalize() throws Throwable



2. 객체의 내용 비교 (equality test)


boolean equals(Object obj)

두 객체가 같은지 비교

실질적으로 두 객체의 내용이 같은지를 검사 하려면 equals() 메소드를 오버라이드 해서 객체가 포함하고 있는 내용을 비교해야 한다.

Object 클래스의 equals() 메소드는 객체의 참조값(주소값)이 같은지 비교한다.

Java.lang.Object.equals() 메소드를 살펴보면

public boolean equals(Object obj) {

return (this == obj);//결국 equals()를 overriding하지                            //않는 한 equals()와 ==의 차이는 없다.

}

Java.lang.String 의 경우는 equals() 메소드를 재정의 하여 다음과 같이 문자열이 같은 경우 같다고 정의하고 있다. 

 public boolean equals(Object anObject) :  Compares this string to the specified object. The result is true if and only if the argument is not null and is a String object that represents the same sequence of characters as this object.



3. 해시코드(HashCode)


해시 코드

해시 코드는 객체에 대한 서명, 또는 checksum과 같은 것으로 보통 객체의 내용을 바탕으로 만들어진 난수처럼 보이는 객체 인식용 정수이다.

객체가 서로 다른 내용을 포함한다면 반드시 달라야 하며 ,객체의 내용이 같다면 일반적으로 같은 값을 가진다.


해시코드는 객체를 Hashtable에 저장하는 경우에 사용한다. 해시코드는 객체를 골고루 저장할 수 있도록 식별자로 활용 할 수 있고 따라서 자료를 찾을 때도 빠르게 찾을 수 있도록 도와 준다.


실행 중 두번 이상 같은 객체의 해시코드가 호출 되는 경우 항상 같은 정수 값을 return 한다.



4. 실습


package javatest;


class Person extends Object {

String name;

Person(String name) {

this.name = name;

}


@Override

public boolean equals(Object obj) {

return this.name.equals(((Person)obj).name);

}

}


public class ObjectTest {

public static void main(String[] args) {

Person p1 = new Person("오라클자바커뮤니티");  

Person p2 = new Person("오라클자바커뮤니티");


//먼저 p1, p2 객체참조변수를 출력해 보자.

//객체명@hashCode를 16 진수로 변환한값 출력

System.out.println("p1.toString() --> " + p1);//javatest.Person@15db9742

System.out.println("p2.toString() --> " + p2);//javatest.Person@6d06d69c


//hashCode 값 출력(int형으로 출력)

//p1, p2는 힙 메모리의 서로 다른 객체이므로 해시코드가 다르다.

System.out.println("p1.hashCode() --> " + p1.hashCode());//366712642

System.out.println("p2.hashCode() --> " + p2.hashCode());//1829164700


System.out.println("p1 == p2 --> " + (p1 == p2));  //false


System.out.println("p1.equals(p2) --> " + p1.equals(p2)); //false


//hashCode 값을 16 진수로 바꾸어서 한번 찍어보자.

System.out.println(Integer.toHexString(p1.hashCode()));//15db9742

System.out.println(Integer.toHexString(p2.hashCode()));//6d06d69c

System.out.println();



//new String() 하는 경우 값이 같아도 다른 메모리 공간에 생성된다.(주소가 다름)

String s1 = new String("abc");

String s2 = new String("abc");


//hashCode 값 출력(문자열값이 같으므로 같은 hashCode, String은 Object의 hashcode()를 재정의)

//String클래스는 equals를 재정의(문자열이 같으면 true)

System.out.println("s1.hashCode() --> " + s1.hashCode());//96354

System.out.println("s2.hashCode() --> " + s2.hashCode());//96354


System.out.println("s1.equals(s2) --> " + s1.equals(s2));//true


System.out.println("s1 == s2      --> " + (s1 == s2));//false

System.out.println();


//new String()이 아닌 문자열 생성은 값이 같으면 "문자열 상수 풀에"서 공유한다.

String s3 = "abc";

String s4 = "abc";


//hashCode 값 출력(문자열값이 같으므로 같은 hashCode)

System.out.println("s3.hashCode() --> " + s3.hashCode());//96354

System.out.println("s4.hashCode() --> " + s4.hashCode());//96354

System.out.println("s3.equals(s4) --> " + s3.equals(s4));//true

System.out.println("s3 == s4      --> " + (s3 == s4));//true

System.out.println();

}

}



[실행결과]

p1.toString() --> javatest.Person@15db9742

p2.toString() --> javatest.Person@6d06d69c

p1.hashCode() --> 366712642

p2.hashCode() --> 1829164700

p1 == p2 --> false

p1.equals(p2) --> true

15db9742

6d06d69c


s1.hashCode() --> 96354

s2.hashCode() --> 96354

s1.equals(s2) --> true

s1 == s2      --> false


s3.hashCode() --> 96354

s4.hashCode() --> 96354

s3.equals(s4) --> true

s3 == s4      --> true


#자바Object, #Object란, #해시코드, #객체비교, #객체지향, #자바동영상#자바강의#자바교육#자바강좌#자바#JAVA#자바동영상강의#추천자바강의#추천자바강좌#JAVA동영상#JAVA강의#JAVA강좌#JAVA교육#JAVA#추천JAVA강의#추천JAVA교육#추천JAVA강좌#자바소스#자바실습   


2020년 9월 20일 일요일

[추천자바강의/추천자바동영상]JAVA다형성이란? Polymorphism개요,메소드재정의,메소드오버로딩,동적바인딩(Dynamic Binding)(자바/JAVA/자바교육/자바강의/자바동영상/자바강좌/추천JAVA강좌/JAVA동영상추천)

 [추천자바강의/추천자바동영상]JAVA다형성이란? Polymorphism개요,메소드재정의,메소드오버로딩,동적바인딩(Dynamic Binding)(자바/JAVA/자바교육/자바강의/자바동영상/자바강좌/추천JAVA강좌/JAVA동영상추천)


ojc.asia/bbs/board.php?bo_table=LecJava&wr_id=756

[추천자바강의/추천자바동영상]JAVA다형성이란? Polymorphism개요,메소드재정의,메소드오버로딩,동��

[추천자바강의/추천자바동영상]JAVA다형성이란? Polymorphism개요,메소드재정의,메소드오버로딩,동적바인딩(Dynamic Binding)(자바/JAVA/자바교육/자바강의/자바동영상/자바강좌/추천JAVA강좌/JAVA동영상)1.

ojc.asia



https://youtu.be/R96LUVjf4t4


[추천자바강의/추천자바동영상]JAVA다형성이란? Polymorphism개요,메소드재정의,메소드오버로딩,동적바인딩(Dynamic Binding)(자바/JAVA/자바교육/자바강의/자바동영상/자바강좌/추천JAVA강좌/JAVA동영상추천)


1. 다형성(polymorphism)



 


객체가 다양한 형태를 취할 수 있는 능력이다.

둘 이상의 IS-A 테스트를 통과 할 수 있는 모든 Java 객체는 다형성으로 간주된다

public interface DriveCar {  ..}

public class Emp { public void work() { … }  }

public class Programmer extends Emp implements DriveCar { public void work() { … } }


Programmer is-a Emp

Programmer is-a DriveCar

Programmer is-a Programmer

Programmer is-a Object


new Programmer() 객체가 타입으로 가능한 것은 위의 is-a 가 허용되는 객체들이다.

Programmer p = new Programmer();


Emp e = p;

DriveCar dc = p;

Object d = p;


e.work() ???


Programmer의 객체 속에는 모든 부모들이 들어 있다. 



다형성은 프로그램에서 특별한 연산자나 키워드가 있는 것이 아니며 객체지향 프로그래밍 언어에서 "오버로딩 (overloading)", "오버라이딩 (overriding)"의 형태로 나타난다. 

오버라이딩(Overriding) : 상위 클래스에 정의된 함수와 동일한 형태의 함수를 하위 클래스에 정의

abstract class Emp { public void work(); }

class Programmer extends Emp {

public void work() {… }

}

오버로딩(Overloading) : 메소드의 매개변수의 유형과 개수가 다르게 하면서 동일한 메소드를 정의하는것

class Programmer {

public void work() {  … }

public void work(String s) {  … }

public void work(int i) {  … }

public int work() {  … }  //오버로딩 아님. 동일한 메소드 정의되었다고 컴파일 오류발생.

}




2. 메소드오버라이딩(메소드 재정의)

상위 클래스의 인스턴스 메소드를 새로 구현함으로써 외부에 다른 반응양식을 보일 수 있다

메쏘드 재정의를 하기위해서

메쏘드 이름이 같아야 하고,

매개변수의 갯수와 그 자료형이 일치하고,

반환치의 자료형이 일치해야 한다.

객체의 타입과 관계없이 참조값(reference)이 가리키는 실제 객체 자료형의 메소드가 선택된다.

실제 자료형에 메쏘드가 없으면 가장 가까운 상위 클래스의 메소드가 선택됨

상위 클래스보다 접근 제어를 강화할 수 없다

상위 클래스에 public으로 되어있는 함수를 하위 클래스에서 private으로 할 수 없다


3. 실습



 


package javatest;

/**

 * 사원이 되려면 일을한다는 규칙, 계약사항

 */

interface Emp {

void work();

}


class Programmer implements Emp {

@Override

public void work() {

System.out.println("프로그래머가 개발을 합니다.");

}

}


class Designer implements Emp {

@Override

public void work() {

System.out.println("디자이너가 디자인을 합니다.");

}

}


class Salesman implements Emp {

@Override

public void work() {

System.out.println("영업사원이 영업을 합니다.");

}

}


public class EmpTest {

public static void main(String[] args) {

Emp[] emps = new Emp[3];


emps[0] = new Programmer();

emps[1] = new Designer();

emps[2] = new Salesman();


for(Emp e : emps)

    e.work();

}

}


프로그래머가 개발을 합니다.

디자이너가 디자인을 합니다.

영업사원이 영업을 합니다.







#자바다향성, #다형성이란, #객체지향다형성, #메소드재정의, #메소드오버로딩, #메소드다중정의, #자바인터페이스, #추상클래스#자바추상클래스#추상메소드#자바추상메소드#자바동영상#자바강의#자바교육#자바강좌#자바#JAVA#자바동영상강의#추천자바강의#추천자바강좌#JAVA동영상#JAVA강의#JAVA강좌#JAVA교육#JAVA#추천JAVA강의#추천JAVA교육#추천JAVA강좌#자바소스#자바실습  

2020년 9월 19일 토요일

JAVA의 추상클래스, 추상메소드(자바/JAVA/자바교육/자바강의/자바동영상/자바강좌/추천JAVA강좌/JAVA동영상)

JAVA의 추상클래스, 추상메소드(자바/JAVA/자바교육/자바강의/자바동영상/자바강좌/추천JAVA강좌/JAVA동영상)


https://youtu.be/Qe9uIUDl4WU

 

1. 추상 메소드(Abstract method)

메소드 선언만 있고 구현없이 (중괄호없이 세미콜론이 뒤에 오는) 선언 된 메서드 입니다.

abstract 리턴타입 메소드이름() ;

추상 메소드는 자식 클래스에서 상속받아 실제 구현을 해야 합니다. (Overriding)

추상 메소드를 만드는 이유는 어떤 행위를 반드시 해야만 하지만 실제 어떻게 행동 할지는 자식클래스들이 상속받아서 입맛에 맞게 구현을 하라는 의미 입니다.

 

 

2. 추상 클래스(Abstract class)

추상 메소드를 하나 이상 포함하면 반드시 추상 클래스가 되어야 합니다.

문법적으로 클래스 정의 앞에 abstract 키워드를 사용하면 그 클래스가 추상 메소드를 가지는지 여부와 관계없이 추상클래스가 되고 new 할 수 없는 클래스가 됩니다.

클래스를 설계할 때 추상화란 공통적인 속성과 행동을 정의하는 것 입니다.

회사의 모든 사원들을 대상으로 클래스를 설계한다고 했을 때 모든 사원들의 공통적인 속성(사번, 이름)과 행동(“출근한다”, “퇴근한다”, “일한다”)을 추출하도 이를 가지는 최 상위의 추상 클래스(사원 클래스 : Emp)를 만들고 출근/퇴근은 실제 구현을 하고 “일한다”는 추상 메소드로 정의를 합니다.

프로그래머(Programmer) , 디자이너(Designer) 클래스를 정의하고 프로그래머는 “개발”을 하고 디자이너는 “디자인”을 하니 각각 Emp 클래스를 상속받아 Programmer는 “개발을 한다“, 디자이너는 “디자인을 한다"라고 자신의 입맛에 맞게 구현을 합니다.

 

3. 실습

package javatest;

 

abstract class Emp {

private String ename;

private String empno;

 

void gotoWork() {

System.out.println(ename + " 출근합니다.");

}

void getOff() {

System.out.println(ename + " 퇴근합니다.");

}

// Emp를 상속 받는 클래스에서 입맛에 맞게 구현을 하나는 의미

abstract void work();

public String getEname() {

return ename;

}

 

public void setEname(String ename) {

this.ename = ename;

}

 

public String getEmpno() {

return empno;

}

 

public void setEmpno(String empno) {

this.empno = empno;

}

}

 

class Programmer extends Emp {

@Override

void work() {

System.out.println(getEname() + " 이(가) 개발을 합니다");

}

}

 

class Designer extends Emp {

@Override

void work() {

System.out.println(getEname() + " 이(가) 디자인을 합니다");

}

}

 

public class AbstractClassTest {

public static void main(String[] args) {

// Emp e = new Emp(); //객체생성 불가능

Programmer p = new Programmer();   p.setEmpno("1111"); p.setEname("홍길동");

Designer d = new Designer();   d.setEmpno("2222"); d.setEname("김길동");

p.gotoWork(); p.work(); p.getOff();

d.gotoWork(); d.work(); d.getOff();

}

}

 

 

// 실행

홍길동 출근합니다.

홍길동 이(가) 개발을 합니다

홍길동 퇴근합니다.

김길동 출근합니다.

김길동 이(가) 디자인을 합니다

김길동 퇴근합니다.

 

#추상클래스, #자바추상클래스, #추상메소드, #자바추상메소드, #자바동영상, #자바강의, #자바교육, #자바강좌, #자바, #JAVA, #자바동영상강의, #추천자바강의, #추천자바강좌, #JAVA동영상, #JAVA강의, #JAVA강좌, #JAVA교육, #JAVA, #추천JAVA강의, #추천JAVA교육, #추천JAVA강좌, #자바소스, #자바실습   

 

(C#교육동영상)C# ADO.NET 실습 ODP.NET/ODAC 설치 오라클 함수 호출 실습, C#학원, WPF학원, 닷넷학원, 자바학원

  (C#교육동영상)C# ADO.NET 실습  ODP.NET/ODAC 설치  오라클 함수 호출 실습, C#학원, WPF학원, 닷넷학원, 자바학원 https://www.youtube.com/watch?v=qIPU85yAlzc&list=PLxU-i...