Smart-World Surf

יחידה 1: מבוא למדעי המחשב ויסודות Java

היכרות עם עקרונות התכנות הבסיסיים וסביבת העבודה ב-Java.

ברוכים הבאים ליחידת הלימוד הראשונה בקורס "מבוא למדעי המחשב ושפת Java"! יחידה זו מהווה את אבן היסוד להבנת עולם התכנות בכלל ולשפת Java בפרט. נצלול לעקרונות תכנות בסיסיים, נכיר את סביבת העבודה ונלמד כיצד לכתוב את תוכניות ה-Java הראשונות שלנו. המטרה היא להקנות לכם את הכלים וההבנה הנדרשים כדי לגשת למשימות תכנות פשוטות ולבנות בסיס איתן להמשך הקורס.

עקרונות תכנות בסיסיים

לפני שנתחיל לכתוב קוד ב-Java, חשוב להבין את המושגים האוניברסליים העומדים בבסיס כל שפת תכנות.

משתנים, טיפוסי נתונים ואופרטורים

כל תוכנית עוסקת בעיבוד נתונים. נתונים אלו מאוחסנים ומופעלים באמצעות משתנים.

משתנה: מיקום בזיכרון המחשב המקבל שם, ומאפשר לאחסן ולשלוף ערכים במהלך ריצת התוכנית.
טיפוס נתונים: קובע את סוג הערכים שמשתנה יכול להכיל (לדוגמה: מספר שלם, מספר עשרוני, תו, ערך בוליאני) ואת טווח הערכים האפשרי.

ב-Java, טיפוסי נתונים פרימיטיביים כוללים: int (שלמים), double (עשרוניים), char (תווים), boolean (אמת/שקר).

אופרטור: סמל המבצע פעולה על אחד או יותר אופרנדים (ערכים או משתנים). לדוגמה: אופרטורים אריתמטיים (+, -, *, /), אופרטורים יחסיים (>, <, ==), אופרטורים לוגיים (&&, ||, !).

מבני בקרה: תנאים ולולאות

מבני בקרה מאפשרים לתוכנית לקבל החלטות ולחזור על פעולות.

  • מבני תנאי (Conditional Statements): מאפשרים לבצע קטע קוד מסוים רק אם תנאי מסוים מתקיים.
    • if: מבצע קוד אם התנאי נכון.
    • if-else: מבצע קוד אחד אם התנאי נכון, וקוד אחר אם התנאי שגוי.
    • if-else if-else: שרשרת תנאים לבדיקת מספר אפשרויות.
  • לולאות (Loops): מאפשרות לחזור על קטע קוד מספר פעמים.
    • while: חוזר על קוד כל עוד תנאי מסוים נכון.
    • for: לולאה המיועדת בדרך כלל לחזרה על קוד מספר ידוע מראש של פעמים, או על איברים באוסף.

יסודות שפת Java

Java היא שפה מונחית עצמים (Object-Oriented), אך נתחיל עם מבנה התוכנית הבסיסי.

מבנה תוכנית Java בסיסית ופלט

כל תוכנית Java מתחילה מנקודת כניסה (entry point) הנקראת שיטת main.

שיטת main: השיטה הראשית שממנה מתחילה ריצת כל תוכנית Java. חתימתה היא תמיד public static void main(String[] args).

כדי להציג מידע למשתמש, נשתמש בפקודות פלט:

  • System.out.println("Hello World");: מדפיס מחרוזת (או ערך אחר) ושורה חדשה.
  • System.out.print("Hello");: מדפיס מחרוזת (או ערך אחר) ללא שורה חדשה.

קלט מהמשתמש באמצעות Scanner

כדי לאפשר לתוכנית לקבל נתונים מהמשתמש, נשתמש במחלקה Scanner.

Scanner: מחלקה ב-Java המאפשרת קריאת קלט ממקורות שונים, לרוב מקלט המקלדת (System.in).

דוגמה לשימוש:

import java.util.Scanner; // יש לייבא את המחלקה
// ...
Scanner scanner = new Scanner(System.in); // יצירת אובייקט Scanner
System.out.print("הכנס שם: ");
String name = scanner.nextLine(); // קריאת מחרוזת
System.out.print("הכנס גיל: ");
int age = scanner.nextInt(); // קריאת מספר שלם
scanner.close(); // סגירת ה-Scanner בסיום השימוש

מבוא למחלקות ואובייקטים

Java היא שפה מונחית עצמים. זהו אחד העקרונות החשובים ביותר שתלמדו.

מחלקה (Class)

תבנית (blueprint) ליצירת אובייקטים. היא מגדירה את התכונות (משתנים) וההתנהגויות (שיטות) המשותפות לכל האובייקטים מסוגה.

אובייקט (Object)

מופע (instance) ספציפי של מחלקה. לכל אובייקט יש מצב (ערכי התכונות שלו) והוא יכול לבצע פעולות (השיטות שלו).

שיטה (Method)

בלוק קוד המבצע פעולה מסוימת. שיטות מגדירות את ההתנהגות של אובייקטים או את הפונקציונליות של מחלקה.

שיטת toString()

שיטה נפוצה וחשובה במחלקות היא toString().

toString(): שיטה במחלקות Java, המוגדרת במקור במחלקת Object, שמטרתה להחזיר ייצוג מחרוזתי של האובייקט. שימושית מאוד לצורך הדפסה ודיבוג.

מומלץ לדרוס (override) שיטה זו במחלקות שלכם כדי לספק ייצוג משמעותי יותר של האובייקט, במקום הייצוג הדיפולטיבי של Java (שם המחלקה וכתובת בזיכרון).

סביבת עבודה ושיטות עבודה מומלצות

כדי לכתוב ולהריץ קוד Java, נשתמש בסביבת פיתוח משולבת (IDE) כמו BlueJ.

BlueJ וקומפילציה

BlueJ: סביבת פיתוח משולבת (IDE) פשוטה וידידותית למתחילים, המיועדת במיוחד ללימוד Java ותכנות מונחה עצמים.
קומפילציה: תהליך שבו קוד המקור (קובץ .java) מתורגם לקוד ביניים (bytecode, קובץ .class) על ידי מהדר (compiler). קוד הביניים הוא זה שמופעל על ידי המכונה הווירטואלית של Java (JVM).

ב-BlueJ, לחיצה על כפתור "Compile" מבצעת את תהליך הקומפילציה. אם יש שגיאות תחביר, המהדר ידווח עליהן.

מוסכמות כתיבה ותיעוד

כתיבת קוד קריא ומתוחזק היא קריטית. הקורס מקפיד על מוסכמות כתיבה מסוימות:

  • שמות מחלקות מתחילים באות גדולה (PascalCase).
  • שמות משתנים ושיטות מתחילים באות קטנה (camelCase).
  • שמות קבועים (constants) באותיות גדולות (UPPER_SNAKE_CASE).
  • הזחה נכונה (indentation) של הקוד.
תיעוד API (Javadoc): כלי מובנה ב-Java המאפשר יצירת תיעוד אוטומטי מקוד המקור באמצעות הערות מיוחדות (/** ... */). חיוני להבנת השימוש במחלקות ובשיטות.
Aliasing (כינוי): מושג קריטי בהבנת אובייקטים ב-Java. כאשר שני משתני ייחוס (reference variables) מצביעים לאותו אובייקט בזיכרון, הם למעשה "כינויים" לאותו אובייקט. שינוי האובייקט דרך אחד המשתנים ישפיע גם על האובייקט הנגיש דרך המשתנה השני. אי הבנה של מושג זה מובילה לשגיאות נפוצות, במיוחד בעת העברת אובייקטים כפרמטרים לשיטות או בעת השוואת אובייקטים.

שאלות לדיון

  • הסבירו את ההבדל העיקרי בין טיפוס נתונים פרימיטיבי למשתנה ייחוס (reference variable) ב-Java, ותנו דוגמה לכל אחד.
  • מדוע חשוב לדרוס את שיטת toString() במחלקה שאתם כותבים, ומה יקרה אם לא תעשו זאת?
  • תארו מצב שבו אי הבנה של מושג ה-aliasing עלולה להוביל לבאג בתוכנית. כיצד ניתן למנוע זאת?
  • הסבירו את חשיבותן של מוסכמות כתיבה ותיעוד (Javadoc) בפרויקט תוכנה.

נקודות לתשובת מודל

  • טיפוסים פרימיטיביים מול ייחוסים: טיפוס פרימיטיבי מאחסן את הערך עצמו (לדוגמה, int x = 5;), בעוד שמשתנה ייחוס מאחסן כתובת למיקום בזיכרון שבו נמצא האובייקט (לדוגמה, MyClass obj = new MyClass();). השוואה בטיפוסים פרימיטיביים משווה ערכים, בייחוסים משווה כתובות (אלא אם כן נדרסת שיטת equals).
  • חשיבות toString(): דריסת toString() מספקת ייצוג קריא ומשמעותי של האובייקט, חשוב לדיבוג ולהצגת מידע למשתמש. ללא דריסה, יתקבל ייצוג ברירת מחדל הכולל את שם המחלקה וקוד גיבוב (hash code) של האובייקט, שאינו אינפורמטיבי.
  • Aliasing ובאגים: אם שני משתני ייחוס מצביעים על אותו אובייקט (obj1 = obj2;), שינוי דרך obj1 ישפיע על obj2 ולהיפך. באג נפוץ הוא כאשר משנים אובייקט בשיטה, והשינוי משפיע על המקור באופן בלתי צפוי. מניעה: הבנה עמוקה של העברת אובייקטים לפי ייחוס, יצירת עותקים עמוקים (deep copies) במקום הקצאת ייחוסים, והימנעות משינוי אובייקטים שהתקבלו כפרמטרים אם אין כוונה לכך.
  • מוסכמות כתיבה ותיעוד: מקדמים קריאות קוד, עקביות, ומקלים על תחזוקה ושיתוף פעולה בצוות. תיעוד Javadoc מאפשר הבנה מהירה של מטרת מחלקות ושיטות ללא צורך לצלול לקוד המימוש, ומקל על שימוש חוזר בקוד.
מצאתם טעות או שחסר משהו?
הבאה ←
תכנות מונחה עצמים (OOP) - יסודות